📍 프로그래머스 2단계 - 위장
이 문제에서의 핵심은 서로 다른 옷의 조합수를 return
하는 것인데, 처음에 부분집합을 사용하여 모든 옷을 입지 않는 경우의 수를 제외하고 로직을 구현하려 했으나 동일 key
값에 있는 value
는 동시에 입을 수 없기 때문에 부분집합을 사용하지 못했다. 결론적으로 하나의 공식을 이용해서 풀어야 하는데 공식은 다음과 같다. key
값마다 의상을 입을 수 있는 경우의 수에서 1을 더해준다. 1을 더해주는 이유는 해당 의상을 입지 않을 수도 있기 때문이다. 모든 key
값에 동일하게 공식을 적용하고 마지막에 1을 빼주는데, 그 이유는 스파이는 하루에 최소 한 개의 의상은 입습니다.
라는 조건을 통해 모든 옷을 벗지 않는다는 점을 유추할 수 있기 때문이다. 이를 식으로 나타내면 다음과 같다.
(얼굴에 착용하는 경우의 수 + 1(착용하지 않는 경우의 수)) * (상의를 입는 경우의 수 + 1(상의를 입지 않는 경우의 수)) * (하의를 입는 경우의 수 + 1(하의를 입지 않는 경우의 수)) * (겉옷을 입는 경우의 수 + 1(겉옷을 입지 않는 경우의 수)) - 1
이 된다.
예를 들어 입출력 예제 #1
은 다음처럼 풀 수 있다. 먼저 Map
을 사용하여 clothes
를 key:value
값으로 나타내면 Map(2) { 'headgear' => 2, 'eyewear' => 1 }
이고, 여기서 위의 공식을 적용하면 ((2+1) * (1+1)) - 1 = 5
로 나타낼 수 있다.
그리고 문제를 풀기 위해 처음에는 Object
를 사용해서 풀고 두 번째는 Map
을 활용하여 풀었는데, 두 로직의 차이점은 value
값이 String
형이냐 Number
형이냐의 차이다. 이 문제에서는 key
에 해당하는 value
의 명단이 필요한 것이 아니고 개수가 필요하기 때문에 굳이 Object
로 모든 value
값을 push
하지 않아도 되는 점을 고려하여 Map
으로 푸는 것이 더 간결하다고 생각했다.
// Map을 활용하여 푼 코드
function solution(clothes) {
const map = new Map();
let answer = 1;
for (const [, category] of clothes) {
map.set(category, (map.get(category) || 0) + 1);
}
for (const [, cnt] of map) {
answer *= cnt + 1;
}
return answer - 1;
}
// Object를 활용하여 푼 코드
function solution(clothes) {
const dict = {};
let answer = 1;
for (const [name, category] of clothes) {
if (!dict[category]) dict[category] = [];
dict[category].push(name);
}
const keys = Object.values(dict);
for (const type of keys) {
answer *= type.length + 1;
}
return answer - 1;
}
'Algorithm > 프로그래머스(Programmers)' 카테고리의 다른 글
[ 자바스크립트(JavaScript) ] 프로그래머스 level2 - 소수 찾기 (0) | 2022.04.04 |
---|---|
[ 자바스크립트(JavaScript) ] 프로그래머스 level2 - H-Index (0) | 2022.03.31 |
[ 자바스크립트(JavaScript) ] 프로그래머스 level2 - 구명보트 (0) | 2022.03.28 |
[ 자바스크립트(JavaScript) ] 프로그래머스 level2 - 큰 수 만들기 (0) | 2022.03.25 |
[ 자바스크립트(JavaScript) ] 프로그래머스 level3 - 네트워크 (0) | 2022.03.23 |
댓글