문제/프로그래머스

[프로그래머스] 의상 - Java

icodesiuuuu 2024. 10. 25. 23:07

문제

https://school.programmers.co.kr/learn/courses/30/lessons/42578

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 


 

문제 개요

코니는 다양한 옷 조합을 좋아합니다. 여러 종류의 옷을 가지고 있는 코니는 매일 다른 조합으로 옷을 입고 싶어 합니다. 각 옷은 특정 종류에 해당하며, 같은 종류의 옷은 한 번에 하나씩만 입을 수 있습니다. 최소 하나의 옷을 입어야 하며, 주어진 옷들로 서로 다른 조합의 수를 구하는 문제입니다.

 

접근 방법

옷의 조합을 구하기 위해서는 각 종류별로 옷의 개수를 확인하고, 각 옷을 입거나 입지 않는 경우를 계산합니다. 조합의 경우 수는 각 종류별 옷 개수 +1 (해당 종류의 옷을 입지 않는 경우 포함)로 계산할 수 있으며, 모든 종류의 옷에 대해 곱셈을 수행하여 조합 수를 구할 수 있습니다. 마지막으로 최소 하나의 옷은 입어야 하므로 모든 조합의 수에서 아무것도 입지 않은 경우(1)를 제외합니다.

 

해결 과정

  1. 종류별 옷 개수 저장
    • 옷 종류별로 개수를 저장하기 위해 해시맵을 사용합니다.
    • 입력된 옷 배열을 순회하며, 옷의 종류를 키로 사용해 해당 종류의 옷 개수를 누적하여 저장합니다.
  2. 모든 조합의 경우 수 계산
    • 각 종류의 옷 개수 +1을 곱하여 모든 경우의 수를 계산합니다.
    • map.size() == 1일 경우, 한 종류의 옷만 존재하므로 바로 해당 종류의 옷 개수를 반환합니다.
    • 여러 종류의 옷이 있을 경우, 각 종류별로 옷을 입는 경우를 모두 곱한 후, 최소 하나의 옷은 입어야 하므로 최종적으로 1을 뺀 값을 반환합니다.

 

import java.util.*;
class Solution {
    public int solution(String[][] clothes) {
        int answer = 0;
        
        Map<String, Integer> map = new HashMap<>();

        for (int i = 0; i < clothes.length; i++) {
            map.put(clothes[i][1], map.getOrDefault(clothes[i][1], 0) + 1);
        }

        if(map.size() == 1) {
            answer = map.get(clothes[0][1]);
        } else {
            int n = 1;
            for(String key : map.keySet()) {
                n *= map.get(key) + 1;
            }
            answer = n - 1;
        }
        
        return answer;
    }
}