본문 바로가기
알고리즘/백준

[Java] BOJ 1759번 암호 만들기

by 컴공맨 2021. 5. 11.
 

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 {
	public static int L, C;
	public static StringBuilder sb;
	public static char[] words;
	public static int[] number;
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine(), " ");
		
		L = Integer.parseInt(st.nextToken());
		C = Integer.parseInt(st.nextToken());
		
		words = new char[C];
		
		st = new StringTokenizer(br.readLine(), " ");
		for (int i = 0; i < C; ++i) {
			words[i] = st.nextToken().charAt(0);
		}
		
		// 암호를 이루는 알파벳이 정렬되어 증가하는 순서로 배열되있을 것으로 추측되므로
		// 우선 정렬을 해준다.
		Arrays.sort(words);
		
		sb = new StringBuilder("");
		combination(0, 0, "");
		
		System.out.println(sb);
	}
	
	public static void combination(int cnt, int idx, String s) {
		// 주어진 길이만큼 암호가 만들어지면
		if (cnt == L) {
			// 모음은 1개 이상
			int vowelCnt = 0;
			// 자음을 2개 이상
			int consonantsCnt = 0;
			for (int i = 0; i < L; ++i) {
				if (s.charAt(i) == 'a' || s.charAt(i) == 'e' || s.charAt(i) == 'i' || s.charAt(i) == 'o' || s.charAt(i) == 'u') {
					vowelCnt++;
				}
				else {
					consonantsCnt++;
				}
			}

			// 모음, 자음 조건 체크
			// 증가하는 순서는 이미 원본 알파벳들을 순서대로 정렬했으므로 상관 X
			if (vowelCnt >= 1 && consonantsCnt >= 2) {
				sb.append(s).append("\n");
			}
			return;
		}
		
		// 알파벳 암호 조합을 찾는다.
		for (int i = idx; i < C; ++i) {
			combination(cnt + 1, i + 1, s + Character.toString(words[i]));
		}
	}
}

 

pyo7410/Algorithm

1일 1커밋을 목표로! Contribute to pyo7410/Algorithm development by creating an account on GitHub.

github.com