๋ณธ๋ฌธ์œผ๋กœ ๋ฐ”๋กœ๊ฐ€๊ธฐ

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

 

1759๋ฒˆ: ์•”ํ˜ธ ๋งŒ๋“ค๊ธฐ

์ฒซ์งธ ์ค„์— ๋‘ ์ •์ˆ˜ L, C๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. (3 ≤ L ≤ C ≤ 15) ๋‹ค์Œ ์ค„์—๋Š” C๊ฐœ์˜ ๋ฌธ์ž๋“ค์ด ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„๋˜์–ด ์ฃผ์–ด์ง„๋‹ค. ์ฃผ์–ด์ง€๋Š” ๋ฌธ์ž๋“ค์€ ์•ŒํŒŒ๋ฒณ ์†Œ๋ฌธ์ž์ด๋ฉฐ, ์ค‘๋ณต๋˜๋Š” ๊ฒƒ์€ ์—†๋‹ค.

www.acmicpc.net


1. ๋ฌธ์ œ ์š”์•ฝ

์„œ๋กœ ๋‹ค๋ฅธ C๊ฐœ์˜ ์•ŒํŒŒ๋ฒณ ์†Œ๋ฌธ์ž ์ค‘ L๊ฐœ๋ฅผ ์„ ํƒํ•˜์—ฌ ์•”ํ˜ธ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

* ์•”ํ˜ธ๋Š” ์ตœ์†Œ 1๊ฐœ์˜ ๋ชจ์Œ(a,e,i,o,u), ์ตœ์†Œ 2๊ฐœ์˜ ์ž์Œ์„ ํฌํ•จํ•œ๋‹ค.

* ์•”ํ˜ธ๋Š” ์ฆ๊ฐ€ํ•˜๋Š” ์ˆœ์„œ์ด๋‹ค.

๊ฐ€๋Šฅ์„ฑ ์žˆ๋Š” ์•”ํ˜ธ๋ฅผ ๋ชจ๋‘ ๊ตฌํ•˜๋ผ.

 

2. ํ’€์ด

์ฒ˜์Œ์—๋Š” ์ˆœ์—ด๋กœ ์ ‘๊ทผํ•˜์˜€๋‹ค. C๊ฐœ ์ค‘ L๊ฐœ๋ฅผ ๋ฝ‘๋Š”๋ฐ, ์ˆœ์„œ๋ฅผ ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค.

ํ•˜์ง€๋งŒ ๊ทธ๋Ÿด ํ•„์š”๊ฐ€ ์—†์—ˆ๋‹ค. C๊ฐœ์˜ ์•ŒํŒŒ๋ฒณ์„ ๋จผ์ € ๋ฐฐ์—ดํ•ด๋†“๊ณ , ๊ฑฐ๊ธฐ์„œ L๊ฐœ๋งŒ ๋ฝ‘์œผ๋ฉด ๋œ๋‹ค.

์กฐํ•ฉ์„ ์‚ฌ์šฉํ•˜์—ฌ ํ‘ธ๋Š” ๋ฌธ์ œ์ด๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด, ๋ชจ๋“  ์ˆœ์—ด ๋ฌธ์ œ๋ฅผ ์ฒ˜์Œ์— ์ •๋ ฌํ•ด๋†“๊ณ  ๊ฑฐ๊ธฐ์„œ ๊ฐœ์ˆ˜๋Œ€๋กœ ๋ฝ‘๋Š” ์กฐํ•ฉ์„ ์‚ฌ์šฉํ•ด๋„ ๋˜๋Š”๊ฑด๊ฐ€? 

=> ์ˆœ์—ด์€ ์ค„์„ธ์šฐ๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜์ด๋‹ค. 5๋ช…์˜ ๊ฐ€์ˆ˜์˜ ๋ฌด๋Œ€ ์ˆœ์„œ๋ฅผ ์ •ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ณด์ž.

5๋ช…์˜ ๊ฐ€์ˆ˜๋ฅผ ์ •๋ ฌํ•ด๋†“๊ณ  ๋ฝ‘๋Š”๋‹ค๋Š”๊ฑด ๋ง๋„ ์•ˆ๋  ๋ฟ๋”๋Ÿฌ ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ์ƒ๊ฐํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์˜๋ฏธ๊ฐ€ ์—†๋‹ค.

=> ์ด ๋ฌธ์ œ๊ฐ€ ํŠน์ดํ•œ ์ผ€์ด์Šค๋‹ค. ์•ŒํŒŒ๋ฒณ์˜ ํŠน์„ฑ์ƒ ์ •๋ ฌ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ๋”ฐ๋ผ์„œ ์•ŒํŒŒ๋ฒณ์„ ์ •๋ ฌ๋œ ์ˆœ์„œ๋กœ ๋ฝ‘์•„์•ผ ํ•œ๋‹ค๋ฉด, 
์•ŒํŒŒ๋ฒณ์„ ์ •๋ ฌํ•ด๋†“๊ณ  ๊ฐœ์ˆ˜๋Œ€๋กœ ๋ฝ‘์œผ๋ฉด ๋œ๋‹ค. ์ˆœ์„œ๋ฅผ ์šฐ๋ฆฌ๊ฐ€ ๊ณ ๋ คํ•˜์ง€ ์•Š์•„๋„ ๋˜๋Š” ๊ฒƒ์ด์—ˆ๋‹ค.

 

1. ์•ŒํŒŒ๋ฒณ์ด ๋‹ด๊ธด src ๋ฐฐ์—ด์„ ๋จผ์ € ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌํ•œ๋‹ค.

2. ์ •๋ ฌ๋œ ์•ŒํŒŒ๋ฒณ ์ค‘ L๊ฐœ๋ฅผ ๋ฝ‘๋Š” ์กฐํ•ฉ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

  • ์—ฌ๊ธฐ์„œ ์ฃผ์˜ํ•  ์ ์€, ๋ชจ์Œ๊ณผ ์ž์Œ์„ ์‹ ๊ฒฝ์จ์ค˜์•ผ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
  • ์ „ํ˜•์ ์ธ ์กฐํ•ฉ ํ‹€์€ ๋‘๊ฐ€์ง€ ๊ฒฝ์šฐ๋กœ ๋‚˜๋ˆ„์–ด ์žฌ๊ท€๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.
    • ์ธ๋ฑ์Šค๋ฅผ ์„ ํƒํ•˜๊ณ  ๋๊นŒ์ง€ ์กฐํ•ฉ์„ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ => ์กฐํ•ฉ์ธ๋ฑ์Šค + 1
    • ์ธ๋ฑ์Šค๋ฅผ ์„ ํƒํ•˜์ง€ ์•Š๊ณ  ๋๊นŒ์ง€ ์กฐํ•ฉ์„ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ => ์กฐํ•ฉ์ธ๋ฑ์Šค (์„ ํƒ์•ˆํ•ด์„œ ๋ฎ์–ด์”€)
  • ์—ฌ๊ธฐ์„œ๋Š” ์ง€๊ธˆ ์ธ๋ฑ์Šค๊ฐ€ ๋ชจ์Œ์ธ์ง€, ์ž์Œ์ธ์ง€๋ฅผ ๋จผ์ € ๋ณด๊ณ ,
    • ๋ชจ์Œ์ผ ๋•Œ ์„ ํƒํ•˜๊ณ   ์กฐํ•ฉ์„ ๋๊นŒ์ง€ ๋งŒ๋“ ๋‹ค   => ์กฐํ•ฉ์ธ๋ฑ์Šค + 1, ๋ชจ์Œ ๊ฐœ์ˆ˜ + 1 
    • ๋ชจ์Œ์ผ ๋•Œ ์„ ํƒํ•˜์ง€ ์•Š๊ณ  ์กฐํ•ฉ์„ ๋๊นŒ์ง€ ๋งŒ๋“ ๋‹ค   => ์กฐํ•ฉ์ธ๋ฑ์Šค , ๋ชจ์Œ ๊ฐœ์ˆ˜
    • ์ž์Œ์ผ ๋•Œ ์„ ํƒํ•˜๊ณ  ์กฐํ•ฉ์„ ๋๊นŒ์ง€ ๋งŒ๋“ ๋‹ค   => ์กฐํ•ฉ์ธ๋ฑ์Šค + 1, ์ž์Œ ๊ฐœ์ˆ˜ + 1 
    • ์ž์Œ์ผ ๋•Œ ์„ ํƒํ•˜์ง€ ์•Š๊ณ  ์กฐํ•ฉ์„ ๋งŒ๋“ ๋‹ค  => ์กฐํ•ฉ์ธ๋ฑ์Šค, ์ž์Œ ๊ฐœ์ˆ˜
  • ๊ฒฝ์šฐ์˜ ์ˆ˜๊ฐ€ ๋Š˜์–ด๋‚ฌ๊ธฐ ๋•Œ๋ฌธ์—, ๊ธฐ์กด์˜ 2๋ฒˆ์˜ ์žฌ๊ท€๊ฐ€ 4๋ฒˆ์˜ ์žฌ๊ท€๋กœ ๋Š˜์–ด๋‚˜๋Š” ๊ฒƒ์ด๋‹ค. 
  • ๋ชจ์Œ๊ฐœ์ˆ˜, ์ž์Œ๊ฐœ์ˆ˜๊ฐ€ ์™”๋˜ ๊ธธ์„ ๋‹ค์‹œ ๊ฐ€๋Š” ๋ฐฑํŠธ๋ž˜ํ‚น์— ์˜ํ•ด ๊ณ„์†ํ•ด์„œ ๊ฐฑ์‹ ๋˜์–ด์•ผ ํ•˜๋ฏ€๋กœ
    ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌํ•˜์—ฌ ๊ฐœ์ˆ˜๋ฅผ ๊ฐฑ์‹ ํ•ด์ค€๋‹ค.
  • ๊ธฐ์ €์กฐ๊ฑด์œผ๋กœ, L๊ฐœ์˜ ์•ŒํŒŒ๋ฒณ์„ ๋‹ค ๋ฝ‘์•˜์„ ๊ฒฝ์šฐ ์žฌ๊ท€ํ•จ์ˆ˜๋Š” return ๋œ๋‹ค.
    ์—ฌ๊ธฐ์„œ complete code๋กœ, ๋ชจ์Œ๊ฐœ์ˆ˜๊ฐ€ 1๊ฐœ ์ด์ƒ, ์ž์Œ๊ฐœ์ˆ˜๊ฐ€ 2๊ฐœ ์ด์ƒ์ธ ์กฐํ•ฉ์€ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋ฏ€๋กœ ์ถœ๋ ฅํ•ด์ค€๋‹ค.
  • ์‹œ๊ฐ„๋ณต์žก๋„๋Š” 2์ดˆ ์ œํ•œ์ด๋ฉฐ (3 ≤ L ≤ C ≤ 15) ๋ฒ”์œ„๋ฅผ ๋งŒ์กฑํ•œ๋‹ค.
    ์ตœ์•…์˜ ๊ฒฝ์šฐ๋ฅผ ์ƒ๊ฐํ•ด๋ดค์„ ๋•Œ 15C7 = 15! / 7!*8! = 6435์ด๋‹ค.
    ์ˆœ์—ด๋กœ ์ˆœ์„œ๊นŒ์ง€ ๊ณ ๋ คํ•ด์„œ ํ’€์—ˆ์„ ๊ฒฝ์šฐ, 15P7 = 15! / 8! = 259459200์ด๋‹ค.
    => ์ฐจ์ด๊ฐ€ ๋งŽ์ด ๋‚œ๋‹ค. ์ˆœ์„œ๋ฅผ ๊ณ ๋ คํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฉด ๊ณ ๋ คํ•˜์ง€ ์•Š๊ณ  ์กฐํ•ฉ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ํ’€์ž.

 

 

3. ๋ฌธ์ œ์ 

 

 

4. ์ฝ”๋“œ

๋”๋ณด๊ธฐ

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

public class BOJ_1759_์•”ํ˜ธ๋งŒ๋“ค๊ธฐ {

	static char[] src, tgt;
	static int N, M;
	public static void main(String[] args) throws Exception{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		M = Integer.parseInt(st.nextToken());
		N = Integer.parseInt(st.nextToken());
		
		tgt = new char[M]; //์กฐํ•ฉ ๋ฐฐ์—ด
		src = new char[N]; //์•ŒํŒŒ๋ฒณ ํ›„๋ณด ๋ฐฐ์—ด
		
		st = new StringTokenizer(br.readLine());
		for (int i = 0; i < N; i++) {
			src[i] = st.nextToken().charAt(0);
		}
		Arrays.sort(src); //์ •๋ ฌ์„ ํ•ด์ฃผ๊ณ  ์กฐํ•ฉ ์ˆ˜ํ–‰
		
		comb(0, 0, 0, 0);
	}
	
	static void comb(int tgtIdx, int srcIdx, int moCnt, int jaCnt) {
		if (tgtIdx == M) { //๊ธฐ์ €์กฐ๊ฑด1. ์กฐํ•ฉ M๊ฐœ๋ฅผ ์™„์„ฑํ–ˆ์„ ๋•Œ
			//complete code
			if (moCnt >= 1 && jaCnt >= 2) { //๋ชจ์Œ 1๊ฐœ ์ด์ƒ, ์ž์Œ 2๊ฐœ ์ด์ƒ -> ๋งŒ์กฑ
				for (int i = 0; i < M; i++)
					System.out.print(tgt[i]);
				System.out.println();
			}
			
			return;
		}
		
		if (srcIdx == N) return; //๊ธฐ์ €์กฐ๊ฑด2. N๊ฐœ์˜ ์•ŒํŒŒ๋ฒณ์„ ๋ชจ๋‘ ๋ดค์„ ๋•Œ
		
		tgt[tgtIdx] = src[srcIdx]; //์กฐํ•ฉ์— ๋„ฃ์–ด์คŒ
		
		//4๋ฒˆ์˜ ์žฌ๊ท€
		if (tgt[tgtIdx] == 'a' ||tgt[tgtIdx] == 'e' ||tgt[tgtIdx] == 'i' ||tgt[tgtIdx] == 'o' ||tgt[tgtIdx] == 'u') {
			comb(tgtIdx + 1, srcIdx + 1, moCnt+1, jaCnt); //๋ชจ์Œ ์„ ํƒํ•˜๊ณ  ์ญ‰ ๊ฐ„ ๊ฒฝ์šฐ
			comb(tgtIdx, srcIdx + 1, moCnt, jaCnt); //๋ชจ์Œ์ด์ง€๋งŒ ์„ ํƒ ์•ˆํ•˜๊ณ  ์ญ‰ ๊ฐ™ ๊ฒฝ์šฐ
		}
			
		else {
			comb(tgtIdx + 1, srcIdx + 1, moCnt, jaCnt+1); //์ž์Œ์„ ํƒํ•˜๊ณ  ์ญ‰ ๊ฐ„ ๊ฒฝ์šฐ
			comb(tgtIdx, srcIdx + 1, moCnt, jaCnt); //์ž์Œ์ด์ง€๋งŒ ์„ ํƒ ์•ˆํ•˜๊ณ  ์ญ‰ ๊ฐ„ ๊ฒฝ์šฐ
		}
		
	}
}