inflearn logo
강의

Course

Instructor

10-Week Completion C++ Coding Test | Algorithm Coding Test

[Essential Concept] Permutations: Creating Permutations with Recursive Functions

질문드려요.

400

vkdvkd35463397

11 asked

0

결국 123을 print하고나서 swap를 통해 원복을 한다고 설명하셨는데요. 123을 print하고 나서 swap를 만나면 1. 왜 원복이 되는 것이고,  2.  8분30초대를 보면 123전 sw(2,2)인데 어떻게 원복을 해서 sw(2,1)이 되는 것인지 모르겠습니다. 왜냐하면 sw(2,2)라 함은 i=2이고 depth=2인데 어떻게 이것이 swap를 만나면서 줄어드는 것인지 잘 모르겠습니다. ㅠㅠ 

C++ 코테 준비 같이 해요!

Answer 3

0

kundol

안녕하세요. ㅎㅎ

자 먼저 2와 3은 스왑이 일어나지 않습니다. 

for문 자체가 3까지니 0, 1, 2만 참조를 하게 되겠죠? 

도식화한 그림입니다. 

 

또한 이를 디버깅하기 쉽게 코드를 다시 짰는데요. 다음과 같습니다. 

이 코드를 돌리게 되면 다음과 같이 디버깅 됩니다. 한 번 확인해보세요. 

3 : 3 : 0 : 1 2 3 

SWAP한다 : 0 : 0

3 : 3 : 1 : 1 2 3 

SWAP한다 : 1 : 1

3 : 3 : 2 : 1 2 3 

SWAP한다 : 2 : 2

3 : 3 : 3 : 1 2 3 

1 2 3 

SWAP한다 - 원복 : 2 : 2

SWAP한다 - 원복 : 1 : 1

SWAP한다 : 2 : 1

3 : 3 : 2 : 1 3 2 

SWAP한다 : 2 : 2

3 : 3 : 3 : 1 3 2 

1 3 2 

SWAP한다 - 원복 : 2 : 2

SWAP한다 - 원복 : 2 : 1

SWAP한다 - 원복 : 0 : 0

SWAP한다 : 1 : 0

3 : 3 : 1 : 2 1 3 

SWAP한다 : 1 : 1

3 : 3 : 2 : 2 1 3 

SWAP한다 : 2 : 2

3 : 3 : 3 : 2 1 3 

2 1 3 

SWAP한다 - 원복 : 2 : 2

SWAP한다 - 원복 : 1 : 1

SWAP한다 : 2 : 1

3 : 3 : 2 : 2 3 1 

SWAP한다 : 2 : 2

3 : 3 : 3 : 2 3 1 

2 3 1 

SWAP한다 - 원복 : 2 : 2

SWAP한다 - 원복 : 2 : 1

SWAP한다 - 원복 : 1 : 0

SWAP한다 : 2 : 0

3 : 3 : 1 : 3 2 1 

SWAP한다 : 1 : 1

3 : 3 : 2 : 3 2 1 

SWAP한다 : 2 : 2

3 : 3 : 3 : 3 2 1 

3 2 1 

SWAP한다 - 원복 : 2 : 2

SWAP한다 - 원복 : 1 : 1

SWAP한다 : 2 : 1

3 : 3 : 2 : 3 1 2 

SWAP한다 : 2 : 2

3 : 3 : 3 : 3 1 2 

3 1 2 

SWAP한다 - 원복 : 2 : 2

SWAP한다 - 원복 : 2 : 1

SWAP한다 - 원복 : 2 : 0

 * 또 질문있으시면 언제든 말씀 주세요. 감사합니다.

#include <bits/stdc++.h>
using namespace std;    
int a[3] = {1, 2, 3};
vector<int> v; 
void printV(vector<int> &v){
    for(int i = 0; i < v.size(); i++){
        cout << v[i] << " ";
    }
    cout << "\n";
}
void makePermutation(int n, int r, int depth){
    cout << n << " : " << r << " : " << depth << " : "; 
    printV(v);
    if(r == depth){
        printV(v);
        return;
    }
    for(int i = depth; i < n; i++){
        cout << "SWAP한다 : " << i << " : " << depth << "\n";
        swap(v[i], v[depth]);
        makePermutation(n, r, depth + 1);
        cout << "SWAP한다 - 원복 : " << i << " : " << depth << "\n";
        swap(v[i], v[depth]);
    }
    return; 
}
int main(){ 
    for(int i = 0; i < 3; i++)v.push_back(a[i]); 
    makePermutation(3, 3, 0); 
    return 0; 
} 

0

vkdvkd35463397

1. 원복에 관해 다시 질문드려요 계속 질문드리네요ㅠ ㅜㅜ  선생님 제가 도식화를 계속해봤는데요. 이전부터 이해가 계속 가지 않는 부분이 저 빨간색 부분입니다. 123을 찍고 makepermutation(3,3,3) 인 상태가 되면 프린트를 찍게 되고, 그 이후에 swap을 만나게 될때 드디어 원복이 되는데.... 저 빨간색 글씨처럼 v[3]은 없는 값이되며, 원복을 하려면 뭔가 위에 쌓았던 값들이 지워져야할 것 같은데.... 절차대로 계속해봐도 저부분의 개념이 이해가 가질 않습니다. 선생님께서도 답답하실것같은데 조금만 더 설명해 주시면 감사드릴게요.  

0

kundol

안녕하세요. ㅎㅎ

1. 원복

    for(int i = depth; i < n; i++){
        swap(v[i], v[depth]);
        makePermutation(n, r, depth + 1);
        swap(v[i], v[depth]);
  }

여기 보시면 swap을 하고 >> 함수작동 >> 이후 함수가 종료가 되면 >> 다시 스왑. 

예를 들어 1과 5를 바꾼 이후... 함수 실행 및 종료 이후에 다시 1과 5를 바꾸면

{1, 5} 에서 {5, 1}로 되었다가 다시 {1, 5}로 원복이 되죠?

 

2. sw(2, 2)

swap(2, 2)는 스왑이 일어나지 않는 거에요. 그래서 해당 부분은 생략처리한거에요. 2번째 인덱스와 2번째 인덱스를 스왑하는 것은 똑같은 일이죠?

 

그리고 혹시 제가 말씀드린대로 도식화 해보셨나요? 저처럼 함수를 따라가면서 그림그리면서 해보셔야 이해가 가실거에요. 

 

감사합니다. 

1-E질문입니다!

0

515

2

3-L 틀린 부분 피드백 부탁드립니다.

0

815

2

1-A문제 순열재귀함수 질문입니다.

0

380

1

1-A 일곱난쟁이문제입니다

0

454

1

문제 풀 때 방향성에 대해

0

797

1

맥에서 vs code로 실행 관련 질문입니다

0

520

1

17071번 메모리 초과

0

384

1

1-C질문입니다!

0

417

2

2-B BFS 시간초과질문

0

628

2

1-O 13번 라인

0

438

1

6-J 놀이공원 문제 질문

0

379

1

구현관련 질문

0

481

1

강의 교안

0

316

1

실력을 더 올리고나서 강의를 보는 것이 맞을까요?

0

544

1

안녕하세요! 재귀함수에 관해서 질문드립니다

0

534

1

1-K

0

471

2

3-G번 질문있습니다.

1

470

3

3-C 실행 시간 질문드립니다.

0

491

1

4-A 문제 풀이 질문있습니다.

0

590

2

비트마스킹 연산자 "1의 보수" 영문 표기법

0

433

1

격자탐색 문제에서 BFS 시간복잡도 질문드립니다.

0

332

1

3-O go 함수 질문 드립니다.

1

443

2

4-A 출력 질문

0

301

1

1주차 1-O 질문드립니다

0

253

1