λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
μ•Œκ³ λ¦¬μ¦˜

[Java] BOJ 9375 νŒ¨μ…˜μ™• μ‹ ν•΄λΉˆ

by 🍊귀🍊 2024. 7. 28.

문제 

문제 링크 https://www.acmicpc.net/problem/9375

    • ν•΄λΉˆμ΄λŠ” νŒ¨μ…˜μ— 맀우 λ―Όκ°ν•΄μ„œ ν•œλ²ˆ μž…μ—ˆλ˜ μ˜·λ“€μ˜ 쑰합을 μ ˆλŒ€ λ‹€μ‹œ μž…μ§€ μ•ŠλŠ”λ‹€.
    • 예λ₯Ό λ“€μ–΄ 였늘 ν•΄λΉˆμ΄κ°€ μ•ˆκ²½, μ½”νŠΈ, μƒμ˜, μ‹ λ°œμ„ μž…μ—ˆλ‹€λ©΄, λ‹€μŒλ‚ μ€ 바지λ₯Ό μΆ”κ°€λ‘œ μž…κ±°λ‚˜ μ•ˆκ²½λŒ€μ‹  렌즈λ₯Ό μ°©μš©ν•˜κ±°λ‚˜ ν•΄μ•Όν•œλ‹€.
    • ν•΄λΉˆμ΄κ°€ 가진 μ˜μƒλ“€μ΄ μ£Όμ–΄μ‘Œμ„λ•Œ κ³Όμ—° ν•΄λΉˆμ΄λŠ” μ•ŒλͺΈμ΄ μ•„λ‹Œ μƒνƒœλ‘œ λ©°μΉ λ™μ•ˆ 밖에 λŒμ•„λ‹€λ‹ 수 μžˆμ„κΉŒ?
    • 첫째 쀄에 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€κ°€ 주어진닀. ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λŠ” μ΅œλŒ€ 100이닀.
      • 각 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ˜ 첫째 μ€„μ—λŠ” ν•΄λΉˆμ΄κ°€ 가진 μ˜μƒμ˜ 수 n(0 ≤ n ≤ 30)이 μ£Όμ–΄μ§„λ‹€.
      • λ‹€μŒ nκ°œμ—λŠ” ν•΄λΉˆμ΄κ°€ 가진 μ˜μƒμ˜ 이름과 μ˜μƒμ˜ μ’…λ₯˜κ°€ 곡백으둜 κ΅¬λΆ„λ˜μ–΄ 주어진닀.
      • 같은 μ’…λ₯˜μ˜ μ˜μƒμ€ ν•˜λ‚˜λ§Œ μž…μ„ 수 μžˆλ‹€.
    • λͺ¨λ“  λ¬Έμžμ—΄μ€ 1이상 20μ΄ν•˜μ˜ μ•ŒνŒŒλ²³ μ†Œλ¬Έμžλ‘œ μ΄λ£¨μ–΄μ ΈμžˆμœΌλ©° 같은 이름을 가진 μ˜μƒμ€ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ”λ‹€.
    • 각 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ— λŒ€ν•΄ ν•΄λΉˆμ΄κ°€ μ•ŒλͺΈμ΄ μ•„λ‹Œ μƒνƒœλ‘œ μ˜μƒμ„ μž…μ„ 수 μžˆλŠ” 경우λ₯Ό 좜λ ₯ν•˜μ‹œμ˜€.

아이디어

  • hashmap을 μ‚¬μš©ν•˜μ—¬ 옷의 μ’…λ₯˜λ₯Ό keyκ°’μœΌλ‘œ λ°›κ³  value κ°’μœΌλ‘œλŠ” ν•΄λ‹Ή key값이 기쑴에 있으면 기쑴에 있던 value 값에 1을 λ”ν•œ 값을 μ €μž₯ν•˜κ³  ν•΄λ‹Ή key값이 μ—†λ‹€λ©΄ 1을 μ €μž₯ν•œλ‹€.
  • 그리고 μ €μž₯된 value값듀을 가지고 결과값을 κ³„μ‚°ν•œλ‹€.
  • 경우의 수λ₯Ό λͺ¨λ‘ κ³±ν•˜λ©΄ λ˜λŠ”λ°, value값은 ν•΄λ‹Ή 옷 μ’…λ₯˜κ°€ λͺ‡κ°œ μžˆλŠ”μ§€ μ €μž₯ν•œ κ°’μ΄λ―€λ‘œ κ·Έ value 값에 1을 λ”ν•œ 값을 결과값에 계속 κ³±ν•΄μ€€λ‹€. (1을 λ”ν•˜λŠ” μ΄μœ λŠ” μž…μ§€ μ•ŠλŠ”λ‹€λŠ” 선택지도 μžˆμœΌλ―€λ‘œ κ²½μš°κ°€ 1 더해지기 λ•Œλ¬Έμ΄λ‹€.)
  • κ·Έλ ‡κ²Œ λͺ¨λ“  경우의 수λ₯Ό κ³±ν•΄μ£Όκ³  λ‚œ 결과값에 1을 λΉΌμ€€λ‹€. (1을 λΉΌμ£ΌλŠ” μ΄μœ λŠ” λͺ¨λ“  옷 μ’…λ₯˜λ₯Ό μž…μ§€ μ•ŠλŠ” κ²½μš°λŠ” λΉΌμ€˜μ•Ό 되기 λ•Œλ¬Έμ΄λ‹€.)

κ²ͺ은 μ‹œν–‰μ°©μ˜€

  • μ²˜μŒμ—λŠ” 경우의 수둜 계산을 ν•˜λ‹€κ°€ λ³΅μž‘ν•œ 길둜 λΉ μ Έλ“€κ³  λ§μ•˜λ‹€...
  • μ‘°ν•©μœΌλ‘œ κ΅¬ν•˜λŠ” 건가 μ‹Άμ–΄μ„œ μˆœμ—΄, 쀑볡 μˆœμ—΄, μ‘°ν•©, 쀑볡 쑰합듀을 μ°Ύμ•„λ΄€μ—ˆλ‹€.
  • κ·Έλ ‡κ²Œ μ‘°ν•©μœΌλ‘œ ν’€λ‹€κ°€ μ˜ˆμ œκ°€ ν†΅κ³Όλ˜κΈΈλž˜ μ œμΆœν–ˆλŠ”λ° 틀리고... λ°˜λ‘€λ“€μ„ μ°Ύμ•„μ„œ μ½”λ“œλ₯Ό κ³ μ³€λŠ”λ° 계속 ν‹€λ Έλ‹€...
  • κ²°κ΅­ μ½”λ“œλ₯Ό 거의 μ§€μš°κ³  λ‹€μ‹œ 경우의 수둜 μ ‘κ·Όν•΄μ„œ ν’€ 수 μžˆμ—ˆλ‹€.. γ…œγ…œ

μ²˜μŒμ— ν’€μ—ˆμ„ λ•Œ λ°”λ‘œ λ§žμ„μ€„ μ•Œμ•˜λ‹€... γ…œγ…œγ…œ
계속 틀렀도 μ•ˆλ λ•ŒλŠ” κ³Όκ°ν•˜κ²Œ μ½”λ“œλ₯Ό μ§€μ›Œμ„œ λ‹€μ‹œ ν’€μ–΄λ³΄λŠ” 것도 쒋은 방법이닀... γ…œ

μ½”λ“œ

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

public class BOJ9375 {
    public static void main(String[] args) throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();

        // ν…ŒμŠ€νŠΈμΌ€μ΄μŠ€ 개수
        int T = Integer.parseInt(br.readLine());

        for(int test = 0; test < T; test++){
            long n = Integer.parseInt(br.readLine());

            // 옷 μ’…λ₯˜λ₯Ό keyκ°’μœΌλ‘œ, 옷 이름을 value κ°’μœΌλ‘œ μ €μž₯
            HashMap<String, Integer> wear = new HashMap<>();

            if(n == 0){
                sb.append(0 + "\n");
            }
            else{
                for(int i = 0; i < n; i++){
                    StringTokenizer st = new StringTokenizer(br.readLine());

                    // 옷 이름
                    String name = st.nextToken();

                    // 옷 μ’…λ₯˜
                    String type = st.nextToken();

                    // λ§Œμ•½ hashmap에 μž…λ ₯받은 옷 μ’…λ₯˜λ₯Ό keyκ°’μœΌλ‘œ 가지고 μžˆλ‹€λ©΄
                    // ν•΄λ‹Ή 옷 μ’…λ₯˜κ°€ 이미 ν•œλ²Œμ΄μƒ λ“€μ–΄μ™”λ‹€λŠ” κ²ƒμ΄λ―€λ‘œ
                    // κ·Έ 옷 μ’…λ₯˜μ— ν•΄λ‹Ήν•˜λŠ” value값에 1λ”ν•΄μ„œ μ €μž₯

                    // hashmap에 keyκ°’κ³Ό valueκ°’ μ €μž₯
                    wear.put(type, wear.getOrDefault(type,0) + 1);
                }

                // 결과값을 μ €μž₯ν•  λ³€μˆ˜
                int result = 1;

                // hashmap에 μ €μž₯λ˜μ–΄ μžˆλŠ” 값듀을 가지고 계산
                for(int i : wear.values()){
                    // 각 옷 μ’…λ₯˜λ§ˆλ‹€ κ°€μ§ˆ 수 μžˆλŠ” 경우의 수λ₯Ό κ³±ν•΄μ€Œ
                    // 각 옷 μ’…μœ λ§ˆλ‹€ 가지고 μžˆλŠ” 옷의 κ°œμˆ˜μ—
                    // μž…μ§€ μ•ŠλŠ”λ‹€λŠ” 선택지도 μžˆμœΌλ‹ˆ, κ°œμˆ˜μ— + 1을 ν•΄μ€Œ
                    result = result * (i + 1);
                }

                // λͺ¨λ“  μ˜·μ„ μž…μ§€ μ•ŠμœΌλ©΄ μ•ˆλ˜λ―€λ‘œ
                // λͺ¨λ‘ μž…μ§€ μ•ŠλŠ” 경우λ₯Ό 뺌
                result = result - 1;

                sb.append(result + "\n");
            }
        }
        System.out.println(sb);
    }
}