Study note/Coding test

순열 - 재귀함수 (C++)

공대 아로마 2024. 4. 12. 17:27

기술면접을 위해 기초 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