오늘은 프로그래머스 위장 문제를 풀었다. 20분 타이머를 제고 했는데 결국에는 넘겼다.. 아니 다 푼 거 같은데 진짜 마지막 경우의 수로 해결하는 부분에서 아이디어가 떠오르지 않아서 결국엔 희정님께 물어봤다.
프로그래머스 - 위장
사실 처음부터 Map을 써야겠다는 생각이 들었다. Map에 있는 has, get, set과 같은 여러 좋은 메소드들을 이용하면 쉽게 풀 수 있을 거 같다는 생각을 했기 때문이다.
일단 두 부분으로 나누어 생각을 했다.
- 의상 종류에 따라 갯수를 파악한다.
- 갯수를 바탕으로 경우의 수를 계산한다.
Map은 이 첫 번째 부분에서 굉장히 유용했다. [["의상종류","갯수"]...]로 clothes배열을 가공해서 has메소드를 이용해서 의상 종류가 있으면 갯수를 하나 더 해주고 없으면 갯수를 1로 해서 새로 set해주었다.
그렇게 아래와 같은 코드가 나왔다.
마지막에 values메소드로 의상 종류에 따른 갯수까지 추출해두었기 때문에 정말로 다 푼 줄 알았다...
function solution(clothes) {
const setMap = new Map([]);
const clothesArr = clothes;
// 각각의 의상 종류가 몇 개 있는지 확인
clothesArr.map((el) =>
setMap.has(el[1])
? setMap.set(el[1], setMap.get(el[1]) + 1)
: setMap.set(el[1], 1)
);
const countResult = setMap.values();
}
저렇게 풀고 10분이 흘렀는데 어떻게 해야 할지 전혀 감이 잡히질 않았다. 메모지에 경우의 수를 계산해보면서 머리를 굴려보았지만 생각이 나질 않았다. 구글링을 해볼까 하던 찰나 희정님께 물어봤는데 다행히도 너무 잘 알려주셔서 쉽게 이해를 할 수 있었다.
아래 코드를 통해서 확인해보자.
function solution(clothes) {
const setMap = new Map([]);
const clothesArr = clothes;
// 각각의 의상 종류가 몇 개 있는지 확인
clothesArr.map((el) =>
setMap.has(el[1])
? setMap.set(el[1], setMap.get(el[1]) + 1)
: setMap.set(el[1], 1)
);
const countResult = setMap.values();
let answer = 1;
for (let a of countResult) {
// 그 의상 종류를 입지 않았을 때를 추가해주어야 한다.
answer *= a + 1;
}
// 아무런 의상을 입지 않은 경우를 하나 빼주어야 한다.
return answer - 1;
}
입지 않은 경우의 수를 포함해야 하기 때문에 바지가 2개라면 2를 곱해주는 것이 아니라 입지 않는 경우를 더해 3을 곱해주어야 하는 것이다. 그리고 의상을 아무것도 입지 않는 경우가 하나 있기 때문에 마지막에 그 경우를 하나 빼주어야 했다. 이 부분을 생각해내지 못해서 20분을 헤매다니ㅜㅜ;