• 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/15666

풀이

  1. 사전 순 β†’ sort μ •λ ¬
  2. 같은 수 μ—¬λŸ¬λ²ˆ β†’ 완전탐색식 μž¬κ·€
  3. λΉ„λ‚΄λ¦Όμ°¨μˆœ β†’ 이전 값이 λ‹€μŒ 값보닀 크지 μ•Šλ„λ‘
#include <bits/stdc++.h>
using namespace std;
 
int n, m;
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';
        return ;
    }
    int tmp = 0;
    for(int i=0; i<n; i++){
        if(tmp == val[i]) continue;
        if(k!=0 && num[k-1] > val[i]) continue;
        num[k] = val[i];
        tmp = num[k];
        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;
}