smooth waters run deep

1d-1c/BOJ

1759_암호 만들기 (JAVA)

yeon_11 2020. 11. 18. 16:17
 

1759번: 암호 만들기

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

www.acmicpc.net

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

public class Main {
	static int len;
	static StringBuilder sb = new StringBuilder();
	public static void main(String[] args) throws Exception{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		len = Integer.parseInt(st.nextToken());
		int len_total = Integer.parseInt(st.nextToken());

		char[] ans = new char[len];
		char[] alph = new char[len_total];
		st = new StringTokenizer(br.readLine());
		for(int i=0; i<len_total; i++){
			alph[i] = st.nextToken().charAt(0);
		}
		Arrays.sort(alph);

		func(alph, ans, 0, 0);
		System.out.print(sb);
		br.close();
	}

	private static void func(char[] alph, char[] ans, int alph_index, int ans_index){ //조합
		if(ans_index==len){
			if(checkalph(ans)){
				for(int i=0; i<len; i++){
					sb.append(ans[i]);
				}
				sb.append('\n');
			}
			return;
		}

		if(alph_index>=alph.length)
			return;

		ans[ans_index] = alph[alph_index];
		func(alph, ans, alph_index+1, ans_index+1);
		func(alph, ans, alph_index+1, ans_index);
	}

	private static boolean checkalph(char[] ans){ //모음,자음 최소 조건 체크
		int mo_cnt = 0;
		int ja_cnt = 0;

		for(int i=0; i<ans.length; i++){
			if(ans[i]=='a' || ans[i]=='e' || ans[i]=='i'
					|| ans[i]=='o' || ans[i]=='u')
				mo_cnt++;
			else
				ja_cnt++;
		}

		if(mo_cnt>=1 && ja_cnt>=2)
			return true;

		return false;
	}
}

 

입력받은 가능성있는 알파벳 중 len개를 뽑고,

그 문자가 모음/자음 최소 개수 조건을 만족하는 지 확인하여 출력하는 방식으로 풀었다.

 

 

 

좀더 자세히 이야기해보면,

 

1. len_total개 문자 중 len개 문자를 뽑는다.

   중복이 안되고 순서가 없는(ab!=ba) '조합'이다. -> func 함수

 

2. 뽑은 문자가 모음/자음 최소 개수 조건 (모음1개이상, 자음2개이상)을 만족하는지 체크한다. -> check함수

 

 

'1d-1c > BOJ' 카테고리의 다른 글

1652_누울 자리를 찾아라 (JAVA)  (0) 2020.11.19
1764_듣보잡 (JAVA)  (0) 2020.11.19
2309_일곱 난쟁이 (JAVA)  (0) 2020.11.18
7562_나이트의 이동 (JAVA)  (0) 2020.11.18
2529_부등호 (JAVA)  (0) 2020.11.17