공부/백준

15650번: N과 M(2)(백준 C++)

상연 2020. 11. 5. 21:35

목차

    15650번: N과 M(2) 링크

    코드

    #include <iostream>
    #include <vector>
    using namespace std;
    
    int n, m;
    bool check[9] = {0, };
    vector <int> v;
    
    void solve(int num, int cnt){
        if(cnt == m) {
            for(int j=0; j<m; j++){
                cout << v[j] << " ";
            }
            cout << "\n";
        }
        else{
            for(int i=num; i<=n; i++){
                if(check[i] == 1) continue;
                check[i] = 1;
                v.push_back(i);
                solve(i+1, cnt + 1);
                v.pop_back();
                check[i] = 0;
            }
        }
    
    }
    int main() {
        cin >> n >> m;
        solve(1, 0);
        return 0;
    }

    사견

    어제 푼 N과 M(1) 의 다음문제이다.
    1의 경우에서는 1 2 와 2 1 을 다른 순열로 판단했지만, 이번 문제는 이 둘을 같은 것으로 보고 앞에서 1 2 가 나오면 후에
    2 1 은 나올 수가 없다.

    즉, 생각해보면 저번 문제에서 조금만 바꾸면 이 문제의 해답이 된다는 뜻과 같다.

    void solve(int num, int cnt){
        if(cnt == m) {
            for(int j=0; j<m; j++){
                cout << v[j] << " ";
            }
            cout << "\n";
        }
        else{
            for(int i=num; i<=n; i++){
                if(check[i] == 1) continue;
                check[i] = 1;
                v.push_back(i);
                solve(i+1, cnt + 1);
                v.pop_back();
                check[i] = 0;
            }
        }
    
    }

    1 문제에서 빼온 함수이다.
    이번 코드와 다른점이 무엇일까?

    바로 함수의 인자이다.

    인자로 반복문의 시작점을 따로 정해주는 것이다.
    이렇게 하면 이 문제를 풀 수 있다.

    '공부 > 백준' 카테고리의 다른 글

    1010번: 다리 놓기(백준 C++)  (0) 2020.11.08
    15651번: N과 M(3)(백준 C++)  (0) 2020.11.06
    15649번: N과 M(1)(백준 C++)  (0) 2020.11.04
    10814번: 나이순 정렬(백준 C++)  (0) 2020.11.03
    1181번: 단어 정렬(백준 C++)  (0) 2020.11.02