[프로그래머스] 의상 (Lv.2, Java)

양현승·2023년 8월 29일

알고리즘

목록 보기
4/9

💡 문제

문제설명

🤔 고민사항

  • 솔직히 처음에 조합문제인줄 알고 쫄았다.
  • 조합문제 맞다.
  • 종류별로 최대 1가지 의상만 착용할 수 있고, 최소 1개 의상은 입는(이 문제에서 제일 이해 안가는 내용) 조합을 어떻게 구현해 내는지가 관건인 것 같다.
  • 잘 생각해보면 의상 종류의 갯수가 중요하지, 의상의 이름은 중요하지 않다.
    앞전의 [프로그래머스] 완주하지 못한 선수 (Lv.1, Java) 문제와 유사한 포인트가 있는데, 중복되는 데이터를 어떻게 해싱처리할지 이다.
    여기서 중복데이터는 같은 종류의 여러 의상이다. 즉, (key값에 의상종류, value값에 해당종류 의상 수)로 표현한다.
  • HashMap을 써서 데이터를 표현했으면, 조합 연산을 어떻게 해야할지 고민해야한다.
    생각보다 간단하다. 모자 종류가 2개, 안경 종류가 1개일 경우를 예를 들어보면,

    모자의 경우의 수 : A모자 착용, B모자 착용, 모자 착용 X (3경우)
    안경의 경우의 수 : C안경 착용, 안경 착용 X (2경우)
    모자와 안경을 합한 경우의 수 = 3 * 2 = 6가지

  • 그런데 '최소 1개 의상은 입습니다' 에 따라, 저 6가지 경우 중 모자착용 X & 안경착용 X 경우를 빼야 한다.
  • 일반화 하면
    (1번 종류 의상의 수 + 1) x (2번 종류 의상의 수 + 1) x....(n번 종류 의상의 수 + 1) - 1
    이 된다.
  • 그럼 이제, HashMap에 value로 저장된 각 종류별 의상수를 활용해 연산을 하면 된다.

👨‍💻 CODE

import java.util.*;

class Solution {
    public int solution(String[][] clothes) {
        int answer = 1;
        Map<String, Integer> hashmap = new HashMap<String, Integer>();
        
        for(int i=0; i<clothes.length; i++)
            hashmap.put(clothes[i][1], hashmap.getOrDefault(clothes[i][1], 0) + 1);
        
        for(int i : hashmap.values())
            answer *= (i + 1);
        
        return answer - 1;
    }
}
profile
기록의 필요성을 느끼고 시작한 곳입니다. 혼잣말 하는것 같아 재밌네요!

0개의 댓글