🔗 문제 링크
📝 풀이 과정
자료구조를 활용하여 경우의 수를 세는 문제이다.
만약 상의를 2개(상의1, 상의2), 바지를 1개(바지1) 가지고 있다면
(상의1)
(상의2)
(상의1, 바지1)
(상의2, 바지1)
(바지1)
총 5가지의 경우가 발생하게 된다.
이처럼, 상의를 입지 않거나 하나를 골라 입는 경우가 발생하게 된다. 때문에, 경우의 수를 셀 때 단순 개수의 곱이 아닌 입지 않는 경우를 고려하여 + 1을 한 결과를 곱셈해주어야 한다.
따라서 (옷의 종류당 개수 + 1) 들의 곱셈으로 구할 수 있는데, 옷을 하나도 입지 않으면 안되기 때문에 옷을 하나도 입지 않는 경우를 - 1 처리하면 된다.
map을 통해 옷의 종류의 개수를 누적하고 이를 계산해 출력하면 된다.
💡 TIP
작은 TIP이지만, 혹시 모르는 사람들에게 도움이 될까 싶어 적는다...
옷의 개수를 누적할 때, map.contains
를 활용해 기존 map에 값이 있는지 없는지 판별해 존재한다면 map.put(key, map.get(key) + 1)
, 아니면 map.put(key, 1)
처리를 할 수도 있다.
if (map.contains(key))
map.put(key, map.get(key) + 1);
else
map.put(key, 1);
하지만 map에 편리한 map.getOrDefault(key, defaultValue)
가 존재하므로 한 번 사용해보자!
만약 map에 key 값이 존재한다면 해당 value를 반환하고, 없다면 설정한 defaultValue
를 반환하기 때문에 한줄로 해결할 수 있다.
map.put(map.getOrDefault(key, 0) + 1);
💻 코드
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int T = sc.nextInt();
for (int tc = 1; tc <= T; tc++) {
int n = sc.nextInt();
Map<String, Integer> map = new HashMap<>();
for (int i = 0; i < n; i++) {
String name = sc.next(), type = sc.next();
map.put(type, map.getOrDefault(type, 0) + 1);
}
int ans = 1;
for (int val : map.values())
ans *= val + 1;
System.out.println(ans - 1);
}
}
}
📊 제출 결과
'알고리즘 풀이 > 백준' 카테고리의 다른 글
[백준] 10026번: 적록색약 - JAVA (0) | 2020.12.13 |
---|---|
[백준] 9461번: 파도반 수열 - JAVA (0) | 2020.12.13 |
[백준] 9205번: 맥주 마시면서 걸어가기 - JAVA (0) | 2020.12.13 |
[백준] 9095번: 1, 2, 3 더하기 - JAVA (0) | 2020.12.13 |
[백준] 9019번: DSLR - JAVA (0) | 2020.12.13 |