기술면접을 위해 기초 CS에 대한 복습중이다.
공부한 내용 중 요점이나 나중에 기억해야할 부분을 정리해보려고 한다.
내가 아는 부분은 생략되어 있을 수 있고, 혹여나 틀린 부분이 있을 수도 있으니 이 글을 보고 '다른 사람'이 공부하기에는 도움이 되지 않을 수 있으니 주의!
재귀함수로 구현
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
/* 순열 알고리즘 */
void Permutation(vector<int>& Array, int Start, int End)
{
// 시작과 끝이 같으면 모든 인덱스 순환했다는 뜻
if (Start == End) {
for (const auto it : Array) {
cout << it << " ";
}
cout << endl;
}
// 인덱스가 서로 다르면
else {
// 모든 인덱스에 대해
for (int i = Start; i <= End; ++i) {
// 시작과 해당 자리 인덱스 바꾸고
swap(Array[Start], Array[i]);
// 시작을 +1만큼 이동시켜 재귀적으로 호출
Permutation(Array, Start + 1, End);
// 원래 상태로 되돌림
// 그래야 다음 인덱스 차례에서 쓸 수 있음
swap(Array[Start], Array[i]);
}
}
}
내가 이해한 바로는,
인덱스를 돌면서 그 인덱스에 해당하는 값을 앞쪽에 고정해놓고
나머지를 자리 바꾸는 식으로 경우의 수를 따지는 방식이다.
그 "나머지"라는 게 재귀적으로 호출되는 방식이다.
※ 출처: 미누시님 블로그
'Study note > Coding test' 카테고리의 다른 글
Hash 문법 정리 (C++) (0) | 2024.04.12 |
---|---|
DP - Dynamic Programming (0) | 2024.04.12 |
Binary Search (0) | 2024.04.12 |
그래프 탐색 알고리즘: DFS/BFS (0) | 2024.04.12 |
그리디 & 구현 (0) | 2024.04.12 |