IT/Java

[프로그래머스, Level 2] 위장(JAVA)_Hash

배당 줍는 다람쥐 2021. 8. 15. 14:15
반응형

안녕하세요.

배당 줍는 다람쥐입니다.

 

오늘 업로드하는 문제는 프로그래머스 Level 2, 위장입니다.

그러면 오늘도 문제 풀이 시작하겠습니다.


문제

프로그래머스 출처

사이트 주소는 아래와 같습니다.

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

 

코딩테스트 연습 - 위장

 

programmers.co.kr

 

문제풀이
import java.util.HashMap;

class Solution {
    public int solution(String[][] clothes) {
        int answer = 1;
        
        HashMap<String, Integer> clothesMap = new HashMap<String, Integer>();
        
        for(int row = 0; row < clothes.length; row++)
            clothesMap.put(clothes[row][1], clothesMap.getOrDefault(clothes[row][1], 0) + 1);
        
        for(String key : clothesMap.keySet())
            answer *= (clothesMap.get(key) + 1);
        
        answer -= 1;
        
        return answer;
    }
}

해당 문제의 핵심은 해시를 사용하여 입력 값들을 Key : Value 형태로 나누고,

나누어진 형태를 가지고 경우의 수를 통해, 결과값을 도출하는 문제였습니다.

 

위에 있는 "문제"의 이미지에 첫번째 입출력 값을 예로 들면,

[["yellowhat", "headgear"], ["bluesunglasses", "eyewear"], ["green_turban", "headgear"]]

** 의상의 종류에 따라 분류
headgear : yellowhat, green_turban
eyewear : bluesunglasses

머리에 쓰는 것과, 눈에 쓰는 것, 두가지로 나눌 수 있습니다.
그리고 하나의 종류에서 두 가지를 동시에 사용하는 경우는 존재하지 않기 때문에
따라서, 의상의 이름은 중요하지가 않습니다.

headgear : 2 / eyewear : 1
위의 형태로 만들 수 있습니다.

 

위의 형태에서 2종류의 옷과 옷이 {m, n}의 개수로 있을 때,

경우의 수를 생각해보면 아래와 같다고 할 수 있습니다.

result = (m + 1) * (n + 1) - 1;

m : headgear 중 하나를 착용한 경우의 수 = 2

n : eyewear 중 하나를 착용한 경우의 수 = 1

그리고 +1의 경우, 착용을 안할 수도 있기 때문에 추가하였습니다.

 

각각의 선택은 독립적으로 일하는 것이 아닌,

동시에 일어나는 선택이기 때문에 곱하여 계산하였습니다.

 

그리고 마지막 -1은, 모든 것을 착용하지 않는 경우는

"스파이는 하루에 최소 한 개 이상의 옷을 입는다"라는 제한사항이 있었기 때문에

제외하였습니다.

 

 

오늘은 문제를 설명하는 것이 조금은 어려웠었던 것 같습니다.

다음에는 조금 더 쉽게 설명할 수 있도록 노력해보겠습니다.

 

 오늘도 제 블로그 글을 봐주셔서 감사합니다.

그럼 안뇽~

 

반응형