본문 바로가기

프로그래머스(Java)/Level 2

[프로그래머스] 의상

728x90

코드 힌트

  1. HashMap 사용: 의류의 종류별 개수를 저장하기 위해 HashMap을 사용합니다.
  2. 조합 계산: 각 의류 종류별로 (의류 수 + 1)을 곱하여 모든 조합을 계산합니다. 여기서 +1은 해당 종류의 의류를 선택하지 않는 경우를 포함합니다.
  3. 모든 종류를 선택하지 않는 경우 제외: 모든 조합에서 하나도 선택하지 않는 경우를 제외하기 위해 최종 결과에서 -1을 합니다.

수학적 힌트

이 문제는 조합을 다루는 문제입니다. 각 종류의 의상은 선택하거나 선택하지 않을 수 있습니다. 예를 들어, 두 종류의 의상(모자, 상의)이 있을 때, 각각 두 개의 옵션(착용하지 않음, 착용)이 있습니다. 이는 아래와 같은 조합을 형성합니다:

  • 모자를 착용하지 않음, 상의를 착용하지 않음
  • 모자를 착용하지 않음, 상의를 착용
  • 모자를 착용, 상의를 착용하지 않음
  • 모자를 착용, 상의를 착용

하지만 모든 의상을 착용하지 않는 경우는 제외해야 하므로, 최종 결과에서 하나를 빼야 합니다.

 

예시

다음은 의류 배열 예시입니다:

String[][] clothes = {
    {"yellow_hat", "headgear"},
    {"blue_sunglasses", "eyewear"},
    {"green_turban", "headgear"}
};

위 예시에서 headgear 종류의 의상은 두 개, eyewear 종류의 의상은 한 개 있습니다. 가능한 조합은 다음과 같습니다:

  1. 아무것도 착용하지 않음(문제 조건에 맞지않음 그렇기에 -1)  
  2. yellow_hat 착용
  3. green_turban 착용
  4. blue_sunglasses 착용
  5. yellow_hat + blue_sunglasses 착용
  6. green_turban + blue_sunglasses 착용

모든 조합의 수는 (2+1) * (1+1) = 6이며, 아무것도 착용하지 않는 경우를 제외하여 최종적으로 5가지 조합이 가능합니다.

 


정답은 더보기 클릭

더보기
import java.util.HashMap;

class Solution {
    public int solution(String[][] clothes) {
        int combinations = 1;  // 조합의 수를 저장하는 변수

        HashMap<String, Integer> clothesCount = new HashMap<>();  // 각 종류별 의류의 개수를 저장하는 해시맵

        // 의류 배열을 순회
        for (String[] item : clothes) {
            String type = item[1];  // 의류의 종류를 가져옴

            // 해시맵에 이미 해당 종류가 있으면, 개수를 증가
            if (clothesCount.containsKey(type)) {
                clothesCount.replace(type, clothesCount.get(type) + 1);
            } else {
                // 없으면, 해당 종류를 해시맵에 추가하고 개수를 1로 설정
                clothesCount.put(type, 1);
            }
        }

        // 조합의 수 계산
        for (String key : clothesCount.keySet()) {
            combinations *= clothesCount.get(key) + 1;  // 각 종류별 (의류 수 + 1)을 곱함
        }

        return combinations - 1;  // 모든 종류의 의류를 하나도 안 입는 경우를 제외
    }
}

 

728x90