• toc {:toc}

문제

λ°”λ‘œ μ–΄μ œ μ΅œλ°±μ€€ 쑰ꡐ가 λ°© μ—΄μ‡ λ₯Ό μ£Όλ¨Έλ‹ˆμ— 넣은 채 κΉœλΉ‘ν•˜κ³  μ„œμšΈλ‘œ κ°€ λ²„λ¦¬λŠ” ν™©λ‹Ήν•œ 상황에 μ§λ©΄ν•œ 쑰ꡐ듀은, 702ν˜Έμ— μƒˆλ‘œμš΄ λ³΄μ•ˆ μ‹œμŠ€ν…œμ„ μ„€μΉ˜ν•˜κΈ°λ‘œ ν•˜μ˜€λ‹€. 이 λ³΄μ•ˆ μ‹œμŠ€ν…œμ€ μ—΄μ‡ κ°€ μ•„λ‹Œ μ•”ν˜Έλ‘œ λ™μž‘ν•˜κ²Œ λ˜μ–΄ μžˆλŠ” μ‹œμŠ€ν…œμ΄λ‹€.

μ•”ν˜ΈλŠ” μ„œλ‘œ λ‹€λ₯Έ L개의 μ•ŒνŒŒλ²³ μ†Œλ¬Έμžλ“€λ‘œ κ΅¬μ„±λ˜λ©° μ΅œμ†Œ ν•œ 개의 λͺ¨μŒ(a, e, i, o, u)κ³Ό μ΅œμ†Œ 두 개의 자음으둜 κ΅¬μ„±λ˜μ–΄ μžˆλ‹€κ³  μ•Œλ €μ Έ μžˆλ‹€. λ˜ν•œ μ •λ ¬λœ λ¬Έμžμ—΄μ„ μ„ ν˜Έν•˜λŠ” μ‘°κ΅λ“€μ˜ μ„±ν–₯으둜 미루어 보아 μ•”ν˜Έλ₯Ό μ΄λ£¨λŠ” μ•ŒνŒŒλ²³μ΄ μ•”ν˜Έμ—μ„œ μ¦κ°€ν•˜λŠ” μˆœμ„œλ‘œ λ°°μ—΄λ˜μ—ˆμ„ 것이라고 μΆ”μΈ‘λœλ‹€. 즉, abcλŠ” κ°€λŠ₯성이 μžˆλŠ” μ•”ν˜Έμ΄μ§€λ§Œ bacλŠ” κ·Έλ ‡μ§€ μ•Šλ‹€.

μƒˆ λ³΄μ•ˆ μ‹œμŠ€ν…œμ—μ„œ 쑰ꡐ듀이 μ•”ν˜Έλ‘œ μ‚¬μš©ν–ˆμ„ λ²•ν•œ 문자의 μ’…λ₯˜λŠ” Cκ°€μ§€κ°€ μžˆλ‹€κ³  ν•œλ‹€. 이 μ•ŒνŒŒλ²³μ„ μž…μˆ˜ν•œ 민식, μ˜μ‹ ν˜•μ œλŠ” μ‘°κ΅λ“€μ˜ 방에 μΉ¨νˆ¬ν•˜κΈ° μœ„ν•΄ μ•”ν˜Έλ₯Ό μΆ”μΈ‘ν•΄ 보렀고 ν•œλ‹€. C개의 λ¬Έμžλ“€μ΄ λͺ¨λ‘ μ£Όμ–΄μ‘Œμ„ λ•Œ, κ°€λŠ₯μ„± μžˆλŠ” μ•”ν˜Έλ“€μ„ λͺ¨λ‘ κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

μž…λ ₯

첫째 쀄에 두 μ •μˆ˜ L, Cκ°€ μ£Όμ–΄μ§„λ‹€. (3 ≀ L ≀ C ≀ 15) λ‹€μŒ μ€„μ—λŠ” C개의 λ¬Έμžλ“€μ΄ 곡백으둜 κ΅¬λΆ„λ˜μ–΄ μ£Όμ–΄μ§„λ‹€. μ£Όμ–΄μ§€λŠ” λ¬Έμžλ“€μ€ μ•ŒνŒŒλ²³ μ†Œλ¬Έμžμ΄λ©°, μ€‘λ³΅λ˜λŠ” 것은 μ—†λ‹€.

좜λ ₯

각 쀄에 ν•˜λ‚˜μ”©, μ‚¬μ „μ‹μœΌλ‘œ κ°€λŠ₯μ„± μžˆλŠ” μ•”ν˜Έλ₯Ό λͺ¨λ‘ 좜λ ₯ν•œλ‹€.

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

풀이

쑰건

  1. 좜λ ₯은 사전 순으둜 β‡’ sort μ •λ ¬ μ‚¬μš©
  2. μ΅œμ†Œ 1개 λͺ¨μŒ, 2개의 자음 ν•„μš” β‡’ vowel을 톡해 ν•΄κ²°
#include <bits/stdc++.h>
using namespace std;
 
int l, c;
char val[20];
char ch[20];
int is_used[20];
int vowel = 0;
 
void func(int k){
    if(k==l){
        if(vowel==0 || l-vowel<2){  // μ΅œμ†Œ λͺ¨μŒ 자음 쑰건
            return;
        }
        for(int i=0; i<l; i++){
            cout << ch[i];
        }
        cout << '\n';
        return;
    }
    for(int i=0; i<c; i++){
        if(is_used[i]) continue;
        if(k!=0 && (int)ch[k-1] > (int)val[i]) continue;
        if(val[i]=='a'||val[i]=='e'||val[i]=='i'||val[i]=='o'||val[i]=='u') vowel++;
        is_used[i] = 1;
        ch[k] = val[i];
        func(k+1);
        is_used[i] = 0;
        if(val[i]=='a'||val[i]=='e'||val[i]=='i'||val[i]=='o'||val[i]=='u') vowel--;
    }
}
 
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    cin >> l >> c;
    for(int i=0; i<c; i++){
        cin >> val[i];
    }
    sort(val, val+c);
    func(0);
    return 0;
}