본문 바로가기

Coding Test/Problem Number

[Java] 패션왕 [9375번]

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

  • 예제 입력1
2
3
hat headgear
sunglasses eyewear
turban headgear
3
mask face
sunglasses face
makeup face
  • 예제 출력1
5
3

  • 문제 접근
    • 중복되지 않는 경우의 수를 구해야하기 때문에 조합으로 접근 필요
    • 첫 번째 테스트 케이스는 다음과 같은 경우의 수를 가짐
      → hat, sunglasses, turban, (hat, sunglasses), (turban, sunglasses)
    • headgear의 경우의 수 ⇒ hat, turbun, null(안 썼을 때) ⇒ 3개
    • eyewear의 경우의 수 ⇒ sunglasses, null(안 썼을 때) ⇒ 2개
    • 3C1(headgear 경우의 수 중 1개 선택) * 2C1(eyewear 경우의 수 중 1개 선택)
      ⇒ 3 * 2 - 1(headgear, eyewear 모두 안 쓴 경우 = 알몸) = 5
  • 문제 해결
    • Map을 이용하여 저장
    • 같은 종류의 옷 끼리는 조합할 수 없으므로 앞의 옷 이름은 필요 없이 뒤의 옷 종류(headgear, eyewear)만 필요
    • 옷 종류마다 수량을 저장하고 최종적으로 옷 종류마다의 경우의 수를 모두 곱한 뒤 - 1(아무것도 입지 않은 경우 제외)
  • 기존 풀이 [메모리 : KB / 시간 : ms]
public static void main(String[] args) throws Exception{
    StringBuilder sb = new StringBuilder();
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    int testCase = Integer.parseInt(br.readLine());

    for(int i = 0; i < testCase; i++){
        Map<String, Integer> fassion = new HashMap<>();
        int count = Integer.parseInt(br.readLine());

        for(int j = 0; j < count; j++){
            String kind = br.readLine().split(" ")[1]; // 옷의 종류만 저장
            fassion.put(kind, fassion.getOrDefault(kind, 0) + 1); // 옷의 종류(key)의 value 1 증가 
        }

        int combination = 1;
        for(int value : fassion.values()) combination *= value + 1; // 모든 경우의 수 곱셈
        sb.append(combination - 1).append("\n"); // 아무 것도 입지 않은 경우(알몸) 제외
    }

    System.out.println(sb);
}

'Coding Test > Problem Number' 카테고리의 다른 글

[Java] 신입 사원 [1946번]  (0) 2024.07.26
[Java] 보물 [1026번]  (0) 2024.07.26
[Java] 크리스마스 선물 [14235번]  (0) 2024.07.25
[Java] 최소 힙 [1927번]  (0) 2024.07.25
[Java] 센티와 마법의 뿅망치 [19638번]  (0) 2024.07.25