개발자

C++ 자료구조 질문..

2023년 03월 31일조회 229

학부생 2학년 입니다.. 물어볼 곳이 없어서.. 순열생성기 코드를 보고 증명을 하면서 이해하고싶은데 함수가 재귀적으로 사용될때 순서가 어떻게 되는지 궁금합니다.. 배열 abc라고 할따 Permutations(a, 0, 2)로 시작해서 하나 하나 어떻게 들어가는지 궁금합니다.. 너무 하찮은 질문 죄송합니당 ㅜ

이 질문이 도움이 되었나요?
'추천해요' 버튼을 누르면 좋은 질문이 더 많은 사람에게 노출될 수 있어요. '보충이 필요해요' 버튼을 누르면 질문자에게 질문 내용 보충을 요청하는 알림이 가요.
profile picture
익명님의 질문

답변 2

Darin Kim님의 프로필 사진

안녕하세요. 배열의 모든 순열을 출력하는 함수가 재귀적으로 구현되어있고, 이 동작 원리가 궁금하신 것 같습니다. 중간중간 로그를 찍어서 전체 과정을 보셔도 좋고, 코드가 간단한 편이라 손으로 한줄 한줄 컴파일 결과를 작성해 가면서 확인하면 바로 이해되실거에요. 예시를 주셨으니 예시대로 손코딩(?)을 하는 예시로 보여드립니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
char a[3] = {'a', 'b', 'c'};
Permutation(a, 0, 2); // Permutation (char *a, const int k, const int m);
===============
// Permutations (a, 0, 2) : k=0, m=2,  0 != 2 이므로 else 문 실행
//for (int i = 0 /* k */ ; i <= 2 /* m */; i++)
i=0,  0 <= 2 (참)  // k=0, m=2 Permutation의 for loop 첫번째
swap(a[0], a[0])  // => abc -> abc
// --> Permutations(a, 1 /* k+1 */, 2 /* m */);
    // k=1, m=2인 상태, 1 !=2 이므로 else 문 실행, 구분을 위해 indent 추가하였습니다.
    // --> for (int i = 1 /* k */ ; i <= 2 /* m */; i++) {
    i=1, 1 <= 2 (참)
    swap(a[1], a[1]) // abc -> abc
    // Permutations(a, 2 /* k+1 */, 2 /* m */);
        // k=2, m=2인 상태, 2 ==2 이므로 if 문 실행, 구분을 위해 indent 추가하였습니다.
        abc 출력, Permutations (a, 2, 2) 종료
    swap(a[1], a[1]);   // abc -> abc
    i=2, 2 <= 2 (참)
    swap(a[1], a[2]) // abc -> acb
    // Permutations (a, 2, /*k+1*/, 2 /* m*/);
        // k=2, m=2인 상태, 2 ==2 이므로 if 문 실행, 구분을 위해 indent 추가하였습니다.
        acb 출력, Permutations (a, 2, 2) 종료
    swap(a[1], a[2]) // acb -> abc
// <--Permutations (a, 1, 2) 종료
swap(a[0], a[0]) // abc -> abc
i=1, 1 <= 2 (참) // k=0, m=2 Permutation의 for loop 두번째
swap(a[0], a[1]) // abc -> bac
// --> Permutations(a, 1, 2);
...
커리어리 AI 봇님의 프로필 사진

C++에서 순열을 생성하는 코드를 이해하려면, 재귀 함수의 작동 원리와 순열 생성 과정에 대해 이해하셔야 합니다. 주어진 질문을 바탕으로 간단한 예시를 들어 설명해 드리겠습니다. 아래는 순열 생성 함수의 간단한 예시입니다. C++에서 순열을 생성하는 코드를 이해하려면, 재귀 함수의 작동 원리와 순열 생성 과정에 대해 이해하셔야 합니다. 주어진 질문을 바탕으로 간단한 예시를 들어 설명해 드리겠습니다. 아래는 순열 생성 함수의 간단한 예시입니다. ' Permutations ' 함수는 세 개의 인자를 받습니다. 1. arr: 순열을 생성할 배열 2. start: 시작 인덱스 3. end: 끝 인덱스 함수가 재귀적으로 호출되는 순서를 설명해 드리겠습니다. arr = {1, 2, 3}인 경우를 가정합시다. 1. 첫 번째 호출: Permutations(arr, 0, 2) - start = 0, end = 2 - for문이 실행되면서 arr[start]와 arr[i]를 교환합니다. - i = 0일 때: arr = {1, 2, 3}, 다음 호출: Permutations(arr, 1, 2)- - i = 1일 때: arr = {2, 1, 3}, 다음 호출: Permutations(arr, 1, 2) - i = 2일 때: arr = {3, 2, 1}, 다음 호출: Permutations(arr, 1, 2) 2. 두 번째 호출(Permutations(arr, 1, 2)로 들어갈 때) - start = 1, end = 2 - for문이 실행되면서 arr[start]와 arr[i]를 교환합니다. - i = 1일 때: arr = {1, 2, 3}, 다음 호출: Permutations(arr, 2, 2) - i = 2일 때: arr = {1, 3, 2}, 다음 호출: Permutations(arr, 2, 2) 3. 세 번째 호출(Permutations(arr, 2, 2)로 들어갈 때) - start = 2, end = 2 - start == end가 참이므로, 배열을 출력합니다. 재귀 호출이 끝나면, 스택이 거꾸로 풀리면서 원래의 순서로 되돌아가게 됩니다. 따라서 다음과 같은 출력 결과를 얻게 됩니다. 1 2 3 1 3 2 2 1 3 2 3 1 3 2 1 3 1 2 위의 출력 결과가 순열 생성의 전체 과정입니다. 재귀 호출을 사용하여 모든 가능한 순열을 생성하고 출력하는 방식으로 동작합니다. 처음 호출에서는 배열의 첫 번째 원소를 고정하고, 두 번째 호출에서는 두 번째 원소를 고정하며, 이 과정을 배열의 끝까지 반복합니다. 이렇게 모든 원소가 고정되면, 하나의 순열이 완성되고 출력됩니다. 재귀 함수의 작동 원리와 순열 생성 과정을 이해하면, 주어진 코드의 동작 순서를 이해하는 데 큰 도움이 될 것입니다. 이해가 어려운 부분이 있다면, 각 재귀 호출 단계에서 배열의 변화를 살펴보고, 출력 순서를 추적해 보는 것도 도움이 될 것입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>
#include <vector>
#include <algorithm>

void Permutations(std::vector<int>& arr, int start, int end) {
    if (start == end) {
        // 출력
        for (int i = 0; i <= end; i++) {
            std::cout << arr[i] << " ";
        }
        std::cout << std::endl;
        return;
    }

    for (int i = start; i <= end; i++) {
        std::swap(arr[start], arr[i]);
        Permutations(arr, start + 1, end);
        std::swap(arr[start], arr[i]); // 원래 상태로 되돌리기
    }
}

int main() {
    std::vector<int> arr = {1, 2, 3};
    Permutations(arr, 0, arr.size() - 1);
    return 0;
}

커리어리 AI 봇의 답변을 평가해 주세요!

지금 가입하면 모든 질문의 답변을 볼 수 있어요!

현직자들의 명쾌한 답변을 얻을 수 있어요.

또는

이미 회원이신가요?

목록으로
키워드로 질문 모아보기

실무, 커리어 고민이 있다면

새로운 질문 올리기

지금 가입하면 모든 질문의 답변을 볼 수 있어요!