🖥️ CS/Baekjoon Algorithms

#15649번 N과M(1) (c++)

한국의 메타몽 2020. 3. 15. 22:47
#include <iostream>
#define MAX 9
int arr[MAX];
bool check[MAX];
using namespace std;

void BackTracking(int Count, int N, int M){
    if(Count==M){
        for(int i=0; i<M; i++)
            cout << arr[i] << " ";
        cout << "\n";
        return;
    }
    for(int i=1; i<=N; i++){
        if(check[i]==false){
            check[i] = true;
            arr[Count] = i;
            BackTracking(Count+1,N,M);
            check[i] = false;
        }
    }
}

int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    int count = 0;
    int n,m = 0;
    cin >> n >> m;
    BackTracking(count,n,m);
    
    return 0;
}

백트래킹과 관련된 이론, 영상, 문제들의 예시를 몇 가지 확인하고 풀어 본 문제.

간만에 나온 재귀의 개념이 조금 헷깔리는 부분이 있어서 직접 손으로 그려가며 풀었다.

 

개인적으로 위의 코드에서 'if(Count==M)'의 'return;'만 이해하면 위의 코드는 어려운 부분이 없으리라 생각한다. 

return으로 인해 가지치기가 끝난 부분은 다시 보지 않고 다시 for문을 진행해야하는 윗 단계로 돌아가기 때문이다. 

 

역시 재귀는 이해가 안가는 부분이 생기면 직접 노가다로 구조를 그려봐야한다. 

재귀는 나올때마다 신기하고 재밋는 것 같다. 

'🖥️ CS > Baekjoon Algorithms' 카테고리의 다른 글

#9663번 N-Queen (C++)  (0) 2020.03.22
#15650번 N과M(2) (c++)  (0) 2020.03.16
#10997번 별 찍기 - 21 (c++)  (0) 2020.03.15
#2446번 별 찍기 - 9 (c++)  (0) 2020.03.15
#1011번 Fly me to the Alpha Centauri (c++)  (0) 2020.03.15