• toc {:toc}

문제

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

  • N개의 μžμ—°μˆ˜ μ€‘μ—μ„œ M개λ₯Ό κ³ λ₯Έ μˆ˜μ—΄
  • 같은 수λ₯Ό μ—¬λŸ¬ 번 골라도 λœλ‹€.

μž…λ ₯

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

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

좜λ ₯

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

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

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

풀이

μ˜€λ¦„μ°¨μˆœμœΌλ‘œ μ¦κ°€ν•˜κΈ° λ•Œλ¬Έμ— sort() ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•œλ‹€.

μ€‘λ³΅λ˜κ²Œ 선택할 수 μžˆλ„λ‘ is_usedλ₯Ό 2μ°¨μ›μœΌλ‘œ μ œμž‘ν•˜λŠ” 방법

Nκ³Ό M(3)μ—μ„œ 배운 방법을 μ‚¬μš©ν•΄λ΄€λ‹€.

#include <bits/stdc++.h>
using namespace std;
 
int n, m;
int val[10];
int is_used[10][10];
int num[10];
 
/*
void func(int k, int fixed){
    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[fixed][i]) continue;
        is_used[fixed][i] = 1;
        num[k] = val[i];
        func(k+1, fixed+1);
        is_used[fixed][i] = 0;
    }
}
*/
 
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++){
        num[k]= val[i];
        func(k+1);
    }
}
 
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;
}