본문 바로가기
개발/코딩테스트

백준 1759번: 암호만들기 [JAVA]

by 로또 2023. 3. 15.

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

 

1759번: 암호 만들기

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

www.acmicpc.net

  • 풀이

주어진 문자 C개 중 L개를 뽑은 뒤 정렬하면 되기 때문에 조합을 사용한다. 초기 문자열을 정렬하고, 재귀 함수를 이용해 자신보다 인덱스가 큰 문자들만 탐색하며 암호를 찾아나간다. 찾은 암호에 모음이 1개, 자음이 2개 이상 있는지 확인한 뒤 출력한다.

  • 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Main {
	static char[] arr; // 알파벳 배열
	static int L, C; 
	static boolean isSelected[];
	
	static void findPW(int r, int start) {
		if (r==L) {
			StringBuilder sb = new StringBuilder();
			int v=0, c=0; //모음, 자음 개수
			for(int i=0; i<C; i++) {
				if (isSelected[i]==true) {
					if (arr[i]=='a'||arr[i]=='e'||arr[i]=='i'||arr[i]=='o'||arr[i]=='u') v++;
					else c++;
					sb.append(arr[i]);
				}
			}
			if (v>=1 && c>=2) System.out.println(sb);
			return;
		}
		
		for(int i=start;i<C; i++) {
			if (isSelected[i]==true) continue;
			isSelected[i] = true;
			findPW(r+1, i);
			isSelected[i] = false;
		}
	}

	public static void main(String[] args) throws IOException {
		BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(bf.readLine());
		
		L = Integer.parseInt(st.nextToken());
		C = Integer.parseInt(st.nextToken());
		
		arr = new char[C];
		isSelected = new boolean[C];
		
		// 알파벳 입력
		st = new StringTokenizer(bf.readLine());
		for (int i = 0; i<C; i++) {
			arr[i] = st.nextToken().charAt(0);
		}
		// 알파벳 정렬
		Arrays.sort(arr); 
		
		findPW(0, 0);
	}

}

댓글