본문 바로가기

알고리즘 스터디

[JAVA] BOJ 9375 패션왕 김해빈

728x90

출처 : 백준

 

이 문제의 경우 옷을 한 개만 입어도 되는 경우를 생각하고 전체 경우의 수에서 아예 하나도 안 입었을 경우를 빼주면 된다.

 

예제 입력 1의 첫 번째 테스트 케이스의 경우 headgear = [hat, turban] , eyewear = [sunglasses]가 있는데 옷 종류 중에 하나만 입어도 된다. 즉, headgear 중 한 개를 입었으면 eyewear를 입지 않아도 된다.

 

이를 반영하면 각 옷 종류에 아무것도 입지 않은 None의 경우를 추가해주어야 한다.

 

headgear = [None, hat, turban] , eyewear = [None, sunglasses] 가 된다.

 

이제 경우의 수를 계산하면 3 * 2 = 6 이 될 것이고 이 때, headgear와 eyewear 둘 다 입지 않은 경우의 수를 빼주면 

6 - 1 = 5 가 정답이다. 

 

이를 구현하기 위해서 HashMap 자료구조 형을 사용했다. headgear 와 eyewear처럼 옷의 종류가 Key 가 되고 Value는 옷의 개수이다. 예제 입력 1의 첫 번째 테스트 케이스의 경우 {"headgear" : 2, "eyewear" : 1} 이 된다.

 

코드를 살펴보면 다음과 같다.

public class Main {
	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		
		StringTokenizer st = new StringTokenizer(br.readLine());
		int T = Integer.parseInt(st.nextToken());
		
		for(int i=0; i<T;i++) {
			st = new StringTokenizer(br.readLine());
			int N = Integer.parseInt(st.nextToken());
			HashMap<String, Integer> map = new HashMap<>();
			String category="";
			for(int j=0; j<N;j++) {
				st = new StringTokenizer(br.readLine());
				String cloth = st.nextToken();
				category = st.nextToken();
				if(map.containsKey(category)) {
					map.put(category, map.get(category)+1);
				}else map.put(category, 1);
			}
			if(map.size()>=2) {
				int sum=1;
				for(Entry<String, Integer> entry : map.entrySet()) {
					sum *= (entry.getValue()+1);
				}
				bw.write(String.valueOf(sum-1)+"\n");
				
			}else if(map.size()==1) bw.write(map.get(category) + "\n");
			else bw.write(String.valueOf(0) + "\n");
		}
		bw.flush();
		bw.close();
	}
}

 

Key = String, Value = Integer 타입인 HashMap을 만들고

 

테스트 케이스를 받아가면서 만약 Key가 중복이라면 Value+=1, 처음 등장하는 Key라면 1로 초기화를 해주었다. 

 

그리고 옷의 종류가 한 가지 뿐이라면 그대로 옷의 개수를 출력하면 되고 만약 옷의 종류가 여러 개라면 앞서 말했던 거처럼 각 옷의 개수에 None의 경우의 수까지 추가하여 계산하면 된다.

 

N에 0이 입력될 수 있기 때문에 0의 경우도 처리해주어야 한다. 그렇지 않으면 틀린다..