알고리즘/문제 풀이

[Java/자바 백준 1062] 가르침

광규니 2022. 1. 18. 12:37
반응형

풀이

문제 해석이 어려웠던 문제.

알파벳 K개를 가르칠 때 N개 단어 중 최대로 읽을 수 있는 개수를 정해주는 문제

"anta"로 시작해서 "tica"로 끝나기 때문에

a,n,t,i,c 5개 알파벳은 꼭 있어야 하므로 K는 5개 이상 이어야합니다.

 

그 다음 조합으로 풀고, 이중 for문을 통해 단어를 읽을 수 있으면 +1 시켜주어서 max값으 비교했습니다.

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

public class Main{
	static int N, K, max;
	static boolean[] isSelected = new boolean[26];
	static String[] strArr;
	public static void main(String[] args) throws Exception{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine()," ");
		N = Integer.parseInt(st.nextToken());
		K = Integer.parseInt(st.nextToken());
		
		if(K < 5) {
			System.out.println(0);
			return;
		}else if(K == 26) {
			System.out.println(N);
			return;
		}
		else {		
			strArr = new String[N];
			for(int i = 0 ; i < N ; i++) {
				String tmp = br.readLine();
				strArr[i] = tmp.substring(4, tmp.length()-4);
			}
			isSelected['a'-97] = true;
			isSelected['n'-97] = true;
			isSelected['t'-97] = true;
			isSelected['i'-97] = true;
			isSelected['c'-97] = true;
			K -= 5;
			combination(0,0);
			System.out.println(max);
		}
	}
	private static void combination(int start, int cnt) {
		if(max == N) {
			return;
		}
		if(cnt == K) {
			int flagCnt = 0;
			for(int i = 0 ; i < N ; i++) {
				boolean flag = true;
				for(int j = 0 ; j < strArr[i].length() ; j++) {
					if(!isSelected[strArr[i].charAt(j) - 97]) {
						flag = false;
						break;
					}
				}
				if(flag == true) {
					flagCnt ++;
				}
			}
			max = Math.max(max, flagCnt);
			return;
		}
		
		for(int i = start ; i < 26 ; i++) {
			if(!isSelected[i]) {
				isSelected[i] = true;
				combination(i+1, cnt+1);
				isSelected[i] = false;
			}
		}
	}
}
반응형