Blog

백준 9375번 패션왕 신해빈: 종류별 선택 수 곱하기

같은 종류의 옷부터 셉니다

옷 이름은 쓰지 않고 종류별 개수만 셉니다. HashMap의 키에는 종류를, 값에는 그 종류의 옷 개수를 저장했습니다. 모자가 두 개라면 모자 종류의 값은 2입니다.

한 종류에 옷이 k개 있으면 그중 하나를 입는 선택이 k가지입니다. 아예 입지 않는 선택이 한 가지 더 있습니다. 각 종류의 개수 + 1을 모두 곱하면 전체 경우의 수가 나옵니다.

이 계산에는 아무것도 입지 않는 경우도 한 번 포함됩니다. 마지막에 1을 빼서 제외합니다. 옷이 하나도 없다면 초기값 1에서 1을 빼므로 결과는 0입니다.

당시 제출 코드

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

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;

        int T = Integer.parseInt(br.readLine());
        int n;

        for (int i = 0; i < T; i++) {
            HashMap<String, Integer> hashMap = new HashMap<>();
            n = Integer.parseInt(br.readLine());
            int result = 1;
            if (n != 0) {
                for (int j = 0; j < n; j++) {
                    st = new StringTokenizer(br.readLine(), " ");
                    String name = st.nextToken();
                    String type = st.nextToken();

                    if (!hashMap.containsKey(type)) {
                        hashMap.put(type, 1);
                    } else {
                        hashMap.put(type, hashMap.get(type) + 1);
                    }
                }

                for (String s : hashMap.keySet()) {
                    result = result * (hashMap.get(s) + 1);
                }
            }
            bw.write((result-1) + "\n");
        }
        bw.flush();
    }
}

키를 순회하며 값을 읽습니다

맵에 저장한 값을 모두 읽으려면 어떻게 해야 할지도 함께 익혔습니다. 메서드 이름은 당시 메모에 적은 .KeySet()이 아니라 keySet()입니다. 코드에서는 이 메서드로 키들을 얻습니다. 별도의 Iterator를 직접 선언하지 않고 향상된 for문으로 각 키를 돌면서 get(s)로 개수를 읽습니다.