본문 바로가기

알고리즘 풀이/백준

[백준] 9375번: 패션왕 신해빈 - JAVA

🔗 문제 링크

BOJ 9375번: 패션왕 신해빈

 

9375번: 패션왕 신해빈

첫 번째 테스트 케이스는 headgear에 해당하는 의상이 hat, turban이며 eyewear에 해당하는 의상이 sunglasses이므로   (hat), (turban), (sunglasses), (hat,sunglasses), (turban,sunglasses)로 총 5가지 이다.

www.acmicpc.net

 

📝 풀이 과정

자료구조를 활용하여 경우의 수를 세는 문제이다.

만약 상의를 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);
        }
    }
}

 

📊 제출 결과