🖥️ CS/Baekjoon Algorithms

#15655번 N과 M(6) (C++)

한국의 메타몽 2021. 3. 9. 02:59

문제 링크 : www.acmicpc.net/problem/15655

 

15655번: N과 M (6)

N개의 자연수와 자연수 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오. N개의 자연수는 모두 다른 수이다. N개의 자연수 중에서 M개를 고른 수열

www.acmicpc.net

N과 M씨리즈 중 마지막으로 인상깊었던 문제이다.

원리를 알면 어렵지 않지만, 생각없이 풀다가 시간이 다소 소요되었다.

 

보다시피 작은 순으로 역순 출력이 불가능하고, 오로지 오름차순으로만 답이 출력되어야한다.

기존 N과 M문제랑 큰 차이는 없는데, 한 가지 중요한 점은 시작지점을 받아서 다음값으로는 시작지점보다 큰 위치에서 값을 저장해야한다는 것이다.

 

기본적으로 N과 M(5)에서 크게 벗어나지 않으므로, 구체적인 해설은 생략한다.

 

#include <iostream>
#include <algorithm>
const int MAX = 9;
using namespace std;

int arr[MAX] = {0,}, temp[MAX] = {0,}, n=0, m=0;
bool ch[MAX] = {false,};

void go(int start, int index, int cnt){
    if(cnt==0){
        for(int i=1; i<=m; i++){
            cout << temp[i] << " ";
        }
        cout << "\n";
        return;
    }
    for(int i=start; i<=n; i++){
        if(!ch[i]){
            ch[i] = true;
            temp[index] = arr[i];
            go(i+1, index+1, cnt-1);
            ch[i] = false;
        }
    }
}

int main() {
    ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
    cin >> n >> m;
    for(int i=1; i<=n; i++){
        cin >> arr[i];
    }
    sort(arr, arr+n+1);
    go(1,1,m);   
    return 0;
}

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

백준 16197번 두 동전 (C++)  (0) 2021.03.10
#18290번 NM과 K (1) (C++)  (0) 2021.03.09
#15654번 N과 M(5) (C++)  (0) 2021.03.09
#17136번 색종이 붙이기 (C++)  (0) 2021.03.08
#1107번 리모컨 (C++)  (0) 2021.03.04