문제 풀이/백준

[백준]9375번. 패션왕 신해빈

27200 2024. 4. 4. 21:27

https://www.acmicpc.net/problem/9375


문제


풀이

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

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int testCase = Integer.parseInt(br.readLine());

        for(int i = 0; i < testCase; i++){
            int clothes = Integer.parseInt(br.readLine());
            System.out.println(answer(clothes, br));
        }
    }
    
    public static int answer(int x, BufferedReader br) throws IOException {
        HashMap<String, Integer> cloth = new HashMap<>();
        
        for(int i = 0; i < x; i++){
            String temp = br.readLine();
            String[] key = temp.split(" ");
            if(cloth.containsKey(key[1])){
                cloth.put(key[1], cloth.get(key[1])+1);
            }else{
                cloth.put(key[1],1);
            }
        }

        int answer = 1;

        for(int k : cloth.values()){
            answer *= k+1;
        }

        return answer -1;
    }
}

 

괜히 메서드 하나 따로 만들어볼라다가 고생 좀 했다. br을 한번만 열어서 매개로 전달해야한다는 것을 몰랐다.

 

풀이 자체는 간단하다.

 

경우의 수의 기본적인 개념을 생각해보면 된다.

여러가지 조합이 가능할 때 선택권의 개념이라고 보면 된다.

3명의 사람이 양팔로 만들 수 있는 조합을 생각해보자.

(왼손,왼손,왼손) 같은 경우가 있을 것이다. 이 때 우리는 선택권의 개념이라는 것을 인지하면 된다.

 

선택권이란? 첫번째 사람이 낼 수 있는 선택권은 3가지이다. 왜냐하면 왼손, 오른손, 안 냄 이 될 수 있기 때문이다. 또한 이 때는 순서를 고려하지 않고 생각하게 된다. (조합이기때문이다.)

 

여기서도 마찬가지로 종류별로 옷의 이름은 중복되지않기 때문에 그에 관심 없이 종류별 개수만 받은 다음에 +1을 해서 곱해주면 된다.(안 입을 가능성) 최종적으론 그것에 -1을 해준다.(모두 안 입을 수도 있기 때문이다.)