• 카테고리

    질문 & 답변
  • 세부 분야

    알고리즘 · 자료구조

  • 해결 여부

    미해결

질문드려요.

22.08.08 17:33 작성 조회수 264

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를 만나면서 줄어드는 것인지 잘 모르겠습니다. ㅠㅠ 

답변 3

·

답변을 작성해보세요.

0

안녕하세요. ㅎㅎ

자 먼저 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

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

0

안녕하세요. ㅎㅎ

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번째 인덱스를 스왑하는 것은 똑같은 일이죠?

 

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

 

감사합니다.