본문 바로가기

[IT] 코딩테스트/[문제 및 풀이] 백준

[백준] 1759 암호 만들기 / 자바(Java)

728x90

문제

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

 

1759번: 암호 만들기

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

www.acmicpc.net

 


해설

모든 가지수를 정렬된 순으로 확인해야하는 문제이므로 브루트포스를 조합을 사용해 해결한다.

조건들이 간단한 조합문제보다 더 다양함으로 이에 주의한다.

조건

  • 최소 하나의 모음과 두개의 자음으로 구성
  • 알파벳들은 정렬되어있음

코드

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

public class Main{
//	12584	112
	static StringBuilder sb = new StringBuilder();
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		StringTokenizer st = new StringTokenizer(br.readLine());
		
		int L = Integer.parseInt(st.nextToken());
		int C = Integer.parseInt(st.nextToken());
		st = new StringTokenizer(br.readLine());
		char [] inputs = new char[C];
		for(int i=0;i<C;i++) {
			inputs[i] = st.nextToken().charAt(0);
		}
		Arrays.sort(inputs);
		
//		System.out.println(Arrays.toString(inputs));
		
		com(L, C, inputs, 0, 0, new char[L]);
		System.out.println(sb);
	}
	
	static void com(int L, int C, char[] inputs, int start, int cnt, char[] tmp) {
		if(cnt == L) {
			int vowel = 0;
			int consonant = 0;
			
			for(char word : tmp) {
				if(word == 'a' || word == 'i' || word == 'o' || word == 'u' || word == 'e' ) {
					vowel++;
				}else {
					consonant++;
				}
			}
			if(vowel>0 && consonant>1) {
				for(char word:tmp) {
					sb.append(word);
				}
				sb.append("\n");
			}
			return;
		}
		
		for(int i=start; i<C;i++) {
			tmp[cnt] = inputs[i];
//			System.out.println(Arrays.toString(tmp));
			com(L, C, inputs, i+1, cnt+1,tmp);
			
		}
		
	}
}
728x90