• toc {:toc}

문제

N 개의 μžμ—°μˆ˜μ™€ μžμ—°μˆ˜ M 이 μ£Όμ–΄μ‘Œμ„ λ•Œ, μ•„λž˜ 쑰건을 λ§Œμ‘±ν•˜λŠ” 길이가 M 인 μˆ˜μ—΄μ„ λͺ¨λ‘ κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€. N 개의 μžμ—°μˆ˜λŠ” λͺ¨λ‘ λ‹€λ₯Έ μˆ˜μ΄λ‹€.

  • N 개의 μžμ—°μˆ˜ μ€‘μ—μ„œ M 개λ₯Ό κ³ λ₯Έ μˆ˜μ—΄
  • κ³ λ₯Έ μˆ˜μ—΄μ€ μ˜€λ¦„μ°¨μˆœμ΄μ–΄μ•Ό ν•œλ‹€.

μž…λ ₯

첫째 쀄에 N κ³Ό M 이 μ£Όμ–΄μ§„λ‹€. (1 ≀ M ≀ N ≀ 8)

λ‘˜μ§Έ 쀄에 N 개의 μˆ˜κ°€ μ£Όμ–΄μ§„λ‹€. μž…λ ₯으둜 μ£Όμ–΄μ§€λŠ” μˆ˜λŠ” 10,000 보닀 μž‘κ±°λ‚˜ 같은 μžμ—°μˆ˜μ΄λ‹€.

좜λ ₯

ν•œ 쀄에 ν•˜λ‚˜μ”© 문제의 쑰건을 λ§Œμ‘±ν•˜λŠ” μˆ˜μ—΄μ„ 좜λ ₯ν•œλ‹€. μ€‘λ³΅λ˜λŠ” μˆ˜μ—΄μ„ μ—¬λŸ¬ 번 좜λ ₯ν•˜λ©΄ μ•ˆλ˜λ©°, 각 μˆ˜μ—΄μ€ 곡백으둜 κ΅¬λΆ„ν•΄μ„œ 좜λ ₯ν•΄μ•Ό ν•œλ‹€.

μˆ˜μ—΄μ€ 사전 순으둜 μ¦κ°€ν•˜λŠ” μˆœμ„œλ‘œ 좜λ ₯ν•΄μ•Ό ν•œλ‹€.

좜처:https://www.acmicpc.net/problem/15655

풀이

μ˜€λ¦„μ°¨μˆœμ΄μ–΄μ•Ό ν•˜λ―€λ‘œ μ •λ ¬λœ 배열을 μ‚¬μš©ν•œλ‹€.

쀑볡을 ν—ˆμš©ν•˜μ§€ μ•Šκ³  m 의 μ›μ†Œλ₯Ό κ°€μ§„ 집합을 μ„ νƒν•˜λŠ” 문제기 λ•Œλ¬Έμ— 두 수의 크기λ₯Ό μ΄μš©ν•΄ μˆœμ„œμ— 따라 κ΅¬λ³„λ˜μ§€ μ•Šλ„λ‘ μ„€μ •ν–ˆλ‹€.

#include <bits/stdc++.h>
using namespace std;
 
int n, m;
int is_used[10];
int val[10];
int num[10];
 
// μ‹œμž‘ 인덱슀 λ³€ν™˜μ„ ν†΅ν•œ 풀이
void func(int k){
    if(k == m){
        for(int i=0; i<m; i++){
            cout << num[i] << ' ';
        }
        cout << '\n';
    }
    int st = 0;
    if(k != 0) st = k;
    for(int i=st; i<n; i++){
        if(num[k-1] >= val[i]) continue;
        num[k] = val[i];
        func(k+1);
    }
}
''' ν‰μ†Œ λ°±νŠΈλž˜ν‚Ή 이용 풀이
void func(int k){
    if(k == m){
        for(int i=0; i<m; i++){
            cout << num[i] << ' ';
        }
        cout << '\n';
        return;
    }
    for(int i=0; i<n; i++){
        if(is_used[i]) continue;
        if(num[k-1]>val[i]) continue;
        is_used[i] = 1;
        num[k] = val[i];
        func(k+1);
        is_used[i] = 0;
    }
}
'''
 
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
 
    cin >> n >> m;
    for(int i=0; i<n; i++){
        cin >> val[i];
    }
    sort(val, val+n);
    func(0);
    return 0;
}