백준 9375번 패션왕 신해빈: 종류별 선택 수 곱하기
같은 종류의 옷부터 셉니다
옷 이름은 쓰지 않고 종류별 개수만 셉니다. HashMap의 키에는 종류를, 값에는 그 종류의 옷 개수를 저장했습니다. 모자가 두 개라면 모자 종류의 값은 2입니다.
한 종류에 옷이 k개 있으면 그중 하나를 입는 선택이 k가지입니다. 아예 입지 않는 선택이 한 가지 더 있습니다. 각 종류의 개수 + 1을 모두 곱하면 전체 경우의 수가 나옵니다.
이 계산에는 아무것도 입지 않는 경우도 한 번 포함됩니다. 마지막에 1을 빼서 제외합니다. 옷이 하나도 없다면 초기값 1에서 1을 빼므로 결과는 0입니다.
당시 제출 코드
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)로 개수를 읽습니다.