뚱땅뚱땅

[문제] 백준 1759번 암호 만들기 본문

알고리즘/백준

[문제] 백준 1759번 암호 만들기

양순이 2021. 2. 14. 21:08
728x90

www.acmicpc.net/problem/1759

 

1759번: 암호 만들기

첫째 줄에 두 정수 L, C가 주어진다. (3 ≤ L ≤ C ≤ 15) 다음 줄에는 C개의 문자들이 공백으로 구분되어 주어진다. 주어지는 문자들은 알파벳 소문자이며, 중복되는 것은 없다.

www.acmicpc.net

풀이

 

조합으로 모든 경우의 수를 구해서 풀면 된다.

public class BOJ_1759 {
	static int L, C;	// L: 선택해야 하는 알파벳 수, C: 선택 가능한 알파벳 수
	static char[] alpha;
	static StringBuilder sb = new StringBuilder();
	public static void main(String[] args) throws IOException {
		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(in.readLine()," ");
		L = Integer.parseInt(st.nextToken());
		C = Integer.parseInt(st.nextToken());
		
		alpha = new char[C];
		st = new StringTokenizer(in.readLine()," ");
		for(int i=0;i<C;i++) {
			alpha[i] = st.nextToken().charAt(0);
		}
		
		Arrays.sort(alpha);	// 사전순 배열
		
		comb(0,new char[L], 0);
		System.out.println(sb);
	}
	// 해당 문자가 모음인지 판별하는 함수 
	static boolean isVowel(char c) {
		if(c=='a' || c=='e' || c=='i'|| c=='o'|| c=='u')
			return true;
		return false;
	}
	// C 개 중 L개 선택하는 조합
	static void comb(int toSelect, char[] selected, int startIdx) {
		if(toSelect==L) {
			int vowel = 0, consonant = 0;
			StringBuilder tmp = new StringBuilder();
			for(int i=0;i<L;i++) {
				char c = selected[i];
				tmp.append(c);
				if(isVowel(c))
					vowel++;
				else
					consonant++;
			}
			//최소 조건
			if(vowel>=1 && consonant>=2)
				sb.append(tmp).append("\n");
			
			return;
		}
		for(int i=startIdx;i<C;i++) {
			selected[toSelect] = alpha[i];
			comb(toSelect+1, selected, i+1);
		}
	}
}
728x90
Comments