알고리즘/백준

9375번 - 패션왕 신해빈

fleur75 2023. 6. 20. 23:22

1️⃣ Subset

 

✏️ 풀이 과정

부분집합의 개수를 세는 문제가 조금 변형된 형태입니다.

 

부분집합을 출력하는 게 아니라 개수만 세면 되기때문에 간단한 곱셈으로 계산할 수 있습니다.

 

이를 위해서는 옷의 종류가 총 몇 개인지 세야하고 각 종류마다 해당되는 옷이 몇 개인지도 알아야 합니다.

이를 구현하기 위해 HashMap을 통해 종류마다 개수를 등록하고 새로운 종류가 등장할 경우 ArrayList에 추가하여 나중에 for문으로 한 번에 처리하도록 만들었습니다.

 

각 테스트 케이스마다 입력을 받고 나면 1에 종류의 개수만큼 for문을 돌려서 옷의 개수+1 만큼을 각각 곱해줍니다.(해당 종류를 고르지 않는 경우도 포함해야 하기 때문에)

 

그리고 나서 1을 빼주면(아무 것도 없는 경우 제거) 풀이가 완료됩니다.

 

💻 코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.StringTokenizer;

public class Main {
	
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int T = Integer.parseInt(br.readLine());
		StringBuilder sb = new StringBuilder();
		int n, cnt;
		StringTokenizer st;
		HashMap<String, Integer> map;
		String type;
		ArrayList<String> types;
		for(int t=0;t<T;t++) {
			n = Integer.parseInt(br.readLine());
			cnt = 1;
			map = new HashMap<>();
			types = new ArrayList<>();
			for(int i=0;i<n;i++) {
				st = new StringTokenizer(br.readLine());
				st.nextToken();
				type = st.nextToken();
				map.put(type, map.getOrDefault(type, 0)+1);
				if(map.get(type) == 1) {
					types.add(type);
				}
			}
			for(int i=0;i<types.size();i++) {
				cnt *= (map.get(types.get(i))+1);
			}
			sb.append(cnt-1+"\n");
		}
		System.out.print(sb);
		br.close();
	}
}