본문 바로가기
백준/완전탐색

백준 1759. 암호 만들기

by 29살아저씨 2021. 8. 26.
반응형

🅰 백준 1759. 암호 만들기

 

1759번: 암호 만들기

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

www.acmicpc.net

✏️ 문제 풀이

  •  

✏️ 소스코드

package bruteforce;

import java.util.*;
import java.io.*;

/*순열 틀렸습니다. 재귀로 다시 풀어보겠습니다.
 * 2. 재귀로 풀어서 맞았습니다 뿌듯
 * */
public class Main_골드5_1759_손은성 {
	static int L, C, vowelCount,consonCount;
	static int input[], ans[];
	static boolean isChecked;
	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());
		L = Integer.parseInt(st.nextToken());
		C = Integer.parseInt(st.nextToken());

		String str = br.readLine();
		input = new int[C];
		ans = new int[L];
		for (int i = 0; i < C; i++) {
			input[i] = (int) (str.charAt(i * 2));
		}
		Arrays.sort(input);
		password(0, 0);
	}

	private static void password(int start, int cnt) {
		
		if(cnt == L) { // 암호문이 다 만들어 졌다면
			for (int i = 0; i < L; i++) {
				sb.append((char)ans[i]);
			}
			System.out.println(sb);
			sb.setLength(0);
			return;
		}
		
		for (int i = start; i < C; i++) {
			
			if(cnt == L - 2 && consonCount == 0) {
				if (!checkVowel(input[i])) {
					ans[cnt] = input[i];
					cnt++;
					consonCount++;
					password(i+1,cnt);
					cnt--;
					if(checkVowel(ans[cnt])) {
						vowelCount--;
					}else {
						consonCount--;
					}
					ans[cnt] = 0;
				}
				else return;
			}
			
			//					모음이 없다면
			else if (cnt == L - 1 && vowelCount == 0) {
				if (checkVowel(input[i])) {
					ans[cnt] = input[i];
					cnt++;
					vowelCount++;
					password(i+1,cnt);
					cnt--;
					if(checkVowel(ans[cnt])) {
						vowelCount--;
					}else {
						consonCount--;
					}
					ans[cnt] = 0;
				}
				else continue;
			} 
			
			// 1개 남았고 자음이 하나밖에 없다면 나머지 자음 넣어줘야함
			else if(cnt == L - 1 && consonCount == 1) {
				if (!checkVowel(input[i])) {
					ans[cnt] = input[i];
					cnt++;
					consonCount++;
					password(i+1,cnt);
					cnt--;
					if(checkVowel(ans[cnt])) {
						vowelCount--;
					}else {
						consonCount--;
					}
					ans[cnt] = 0;
				}
				else continue;	
			}
			else {
				ans[cnt] = input[i];
				if(checkVowel(ans[cnt])) {
					vowelCount++;
				}else {
					consonCount++;
				}
				cnt++;
				password(i+1,cnt);
				cnt--;
				if(checkVowel(ans[cnt])) {
					vowelCount--;
				}else {
					consonCount--;
				}
				ans[cnt] = 0;
			}
		}
	}
	
	// 모음,자음 체크 함수
	private static boolean checkVowel(int i) {
		if(i == 97 || i == 101 || i == 105 || i == 111 || i == 117)
			return true;
		return false;
	}
}

 

✅ 후기

  •  
반응형

'백준 > 완전탐색' 카테고리의 다른 글

백준 5014. 스타트링크  (0) 2021.08.26
백준 9663. N-Queen  (0) 2021.08.26
백준 2251. 물통  (0) 2021.08.26
백준 1697. 숨바꼭질  (0) 2021.08.26
백준 1182. 부분수열의 합  (0) 2021.08.26

댓글