안녕하세요.
배당 줍는 다람쥐입니다.
오늘 업로드하는 문제는 프로그래머스 Level 2, 위장입니다.
그러면 오늘도 문제 풀이 시작하겠습니다.
문제
사이트 주소는 아래와 같습니다.
https://programmers.co.kr/learn/courses/30/lessons/42578
문제풀이
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은, 모든 것을 착용하지 않는 경우는
"스파이는 하루에 최소 한 개 이상의 옷을 입는다"라는 제한사항이 있었기 때문에
제외하였습니다.
오늘은 문제를 설명하는 것이 조금은 어려웠었던 것 같습니다.
다음에는 조금 더 쉽게 설명할 수 있도록 노력해보겠습니다.
오늘도 제 블로그 글을 봐주셔서 감사합니다.
그럼 안뇽~
'IT > Java' 카테고리의 다른 글
[프로그래머스, Level 1] 부족한 금액 계산하기(JAVA) (0) | 2022.08.31 |
---|---|
[프로그래머스, Level 1] 신규 아이디 추천(JAVA) (0) | 2022.08.31 |
[프로그래머스, Level 1] 로또의 최고 순위와 최저 순위(JAVA) (0) | 2022.08.01 |
[프로그래머스, Level 1] 완주하지 못한 선수(JAVA) (0) | 2021.08.11 |
[프로그래머스, Level 2] 소수 찾기(JAVA) (0) | 2021.08.07 |