코딩테스트/백준

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

플래시🦥 2023. 2. 28.
반응형
https://www.acmicpc.net/problem/1759
 

1759번: 암호 만들기

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

www.acmicpc.net


1. 암호는 최소 한 개의 모음(a, e, i, o, u)과 최소 두 개의 자음으로 구성되어 있다.

2. 알파벳이 증가하는 순서로 배열되어 있다.

 

위 조건에 해당하는 길이 L의 암호를 C개의 문자를 가지고 가능성 있는 암호를 모두 출력하는 문제이다. 

입력받은 알파벳을 알파벳 순으로 정렬하고 만들 수 있는 모든 조합을 가지고 적합한 비밀번호인가 검증하면 된다. 

 

예제 입력의 a t c i s w 는 정렬하면 [a, c, i, s, t, w]이다. 정렬을 하는 이유는 2번 조건에 맞추기 위함이다. 

이 알파벳을 가지고 암호길이(L)의 암호를 만들면된다. 

[a, c, i, s] -> [a, c, i, t] ->[a, c, i, w] ->[a, c, s, t] ->[a, c, s, w] ->[a, c, t, w] ->[a, i, s, t] ->[a, i, s, w] ->... ->[i, s, t, w]

이런식으로 암호를 만들어 갈 수 있도록 코드를 구성한다. 

for(int i=start; i<C;i++) {
			pwd[len]=alpha[i];
			combin(len+1,i+1);
		}

재귀를 사용하여 비밀번호를 만들 수 있다. 

 

그리고 만든 암호가 모두 가능성이 있는 것은 아니기 때문에 조건에 맞는 비밀번호인지 확인하는 과정이 필요하다.

1번 조건을 위해 만든 암호의 자음 모음 조건이 맞으면 true를 아니면 false를 반환하도록 하였다.

static boolean check (String[] pw) {
		int c =0; //자음
		int v =0; //모음
		for (int i = 0; i < pwd.length; i++) {
			if(pwd[i].equals("a")||pwd[i].equals("e")||pwd[i].equals("i")||pwd[i].equals("o")||pwd[i].equals("u"))
				v++;
			else
				c++;
		}
		if(c >=2 && v>=1) return true; 
		else return false; 
	}

 


최종 코드

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

public class Main {
	static int L,C;
	static String[] pwd,alpha;
	
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String[] str1 = br.readLine().split(" ");
		L = Integer.parseInt(str1[0]);	// 암호 길이
		C = Integer.parseInt(str1[1]);	// 암호에 사용될 알파벳 갯수
		
		pwd= new String[L];
		alpha = new String[C];
		
		alpha = br.readLine().split(" ");
		Arrays.sort(alpha);
		combin(0,0);
		
	}// main()
	
	static void combin(int len, int start) {
	
		if(len>=L) {
			if(check(pwd)) {
				for(String p : pwd) {
					System.out.print(p);
				}
				System.out.println();
			}
			return;
		}
		
		for(int i=start; i<C;i++) {
			pwd[len]=alpha[i];
			combin(len+1,i+1);
		}
	}//combin()
	static boolean check (String[] pw) {
		int c =0; //자음
		int v =0; //모음
		for (int i = 0; i < pwd.length; i++) {
			if(pwd[i].equals("a")||pwd[i].equals("e")||pwd[i].equals("i")||pwd[i].equals("o")||pwd[i].equals("u"))
				v++;
			else
				c++;
		}
		if(c >=2 && v>=1) return true; 
		else return false; 
	}//check()
}// class Main

728x90
반응형

'코딩테스트 > 백준' 카테고리의 다른 글

[Java] 백준 2293 : 동전 1  (0) 2023.03.07
[Java] 백준 15686 : 치킨 배달  (0) 2023.03.06
[JAVA] 백준 9251 : LCS  (0) 2023.02.27
[Java] 백준 7569 : 토마토  (0) 2023.02.27
[Java] 백준 10026 : 적록색약  (0) 2023.02.24

댓글