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

 

1759번: 암호 만들기

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

www.acmicpc.net

코드설명

백트래킹 문제입니다.

 

문제에서 유의해야할점은, 암호들로 주어진 알파벳들을 중복해서 사용하는 순열을 사용하면 안되고

일반 순열을 구하여 진행합니다. 

 

이 문제에서 JAVA의 Stream을 활용하여 문자열에서 문자의 개수를 구했습니다.

moeumCnt += str.chars().filter(c -> c == 'a').count();

혹은 replace를 사용하여 'a,e,i,o,u'를 공백으로 replace한뒤 기존 length - 바꾼 문자열로 하면 모음의 개수가 나옵니다. 

 

아니면, 문자열을 사용하여 풀지않고

char[] answer = new char[L] 으로 선언하여 char을 단순히 순회해서 구해도 됩니다.

코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class Main {
	public static int L, C;
	public static char[] arr;
	
	public static int answer = 0;
    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());
    	
    	st = new StringTokenizer(br.readLine());
    	arr = new char[C];
    	for(int i=0;i<C;i++) {
    		arr[i] = st.nextToken().charAt(0);
    	}
    	
    	Arrays.sort(arr);
    	
    	simulate(0, 0, "");
    }
    
    public static void simulate(int idx, int level, String s) {
    	
    	if(level == L && check(s) == true) {
    		System.out.println(s);
    		return ;
    	}
    	if(level >= L) {
    		return ;
    	}
    		
    	
    	for(int i=idx; i<C;i++) {
    		simulate(i+1, level + 1, s + arr[i]);
    	}
    }
    
    public static boolean check(String str) {
    	
    	
    	long moeumCnt = str.chars().filter(c -> c == 'a').count();
    	moeumCnt += str.chars().filter(c -> c == 'e').count();
    	moeumCnt += str.chars().filter(c -> c == 'i').count();
    	moeumCnt += str.chars().filter(c -> c == 'o').count();
    	moeumCnt += str.chars().filter(c -> c == 'u').count();
    	
    	long jaeumCnt = 0;
    	jaeumCnt = L - moeumCnt;
    	if(moeumCnt >= 1 && jaeumCnt >= 2) {
    		return true;
    	}
    	return false;
    	
    }

    
    
    
}

+ Recent posts