• toc {:toc}

문제

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

  • N 개의 μžμ—°μˆ˜ μ€‘μ—μ„œ M 개λ₯Ό κ³ λ₯Έ μˆ˜μ—΄
  • κ³ λ₯Έ μˆ˜μ—΄μ€ λΉ„λ‚΄λ¦Όμ°¨μˆœμ΄μ–΄μ•Ό ν•œλ‹€.
    • 길이가 K 인 μˆ˜μ—΄ A κ°€ A ≀ A ≀ … ≀ A ≀ A λ₯Ό λ§Œμ‘±ν•˜λ©΄, λΉ„λ‚΄λ¦Όμ°¨μˆœμ΄λΌκ³  ν•œλ‹€.

μž…λ ₯

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

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

좜λ ₯

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

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

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

풀이

15663: N κ³Ό M (9) 와 같은 풀이에 μΆ”κ°€λ‘œ

이전에 μ„ νƒλœ μˆ˜κ°€ λ‹€μŒμ— 선택될 μˆ˜λ³΄λ‹€ μž‘λ„λ‘ μ„€μ •ν•œλ‹€.

#include <bits/stdc++.h>
using namespace std;
 
int n, m;
int val[10];
int num[10];
int is_used[10];
 
void func(int k){
    if(k == m){
        for(int i=0; i<m; i++){
            cout << num[i] << ' ';
        }
        cout << '\n';
        return ;
    }
    int tmp = 0;
    for(int i=0; i<n; i++){
        if(is_used[i]) continue;
        if(tmp == val[i]) continue;
        if(k != 0 && num[k-1] > val[i]) continue;
        is_used[i] = 1;
        num[k] = val[i];
        tmp = num[k];
        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;
}