문제
스파이들은 매일 다른 옷을 조합하여 입어 자신을 위장합니다.
예를 들어 스파이가 가진 옷이 아래와 같고 오늘 스파이가 동그란 안경, 긴 코트, 파란색 티셔츠를 입었다면 다음날은 청바지를 추가로 입거나 동그란 안경 대신 검정 선글라스를 착용하거나 해야 합니다.
종류 | 이름 |
---|---|
얼굴 | 동그란 안경, 검정 선글라스 |
상의 | 파란색 티셔츠 |
하의 | 청바지 |
겉옷 | 긴 코트 |
스파이가 가진 의상들이 담긴 2차원 배열 clothes가 주어질 때 서로 다른 옷의 조합의 수를 return 하도록 solution 함수를 작성해주세요.
제한사항
- clothes의 각 행은 [의상의 이름, 의상의 종류]로 이루어져 있습니다.
- 스파이가 가진 의상의 수는 1개 이상 30개 이하입니다.
- 같은 이름을 가진 의상은 존재하지 않습니다.
- clothes의 모든 원소는 문자열로 이루어져 있습니다.
- 모든 문자열의 길이는 1 이상 20 이하인 자연수이고 알파벳 소문자 또는 '_' 로만 이루어져 있습니다.
- 스파이는 하루에 최소 한 개의 의상은 입습니다.
입출력 예
clothes | return |
---|---|
[["yellowhat", "headgear"], ["bluesunglasses", "eyewear"], ["green_turban", "headgear"]] | 5 |
[["crowmask", "face"], ["bluesunglasses", "face"], ["smoky_makeup", "face"]] | 3 |
내 풀이
- 이 문제는 해시 문제이다.
- 해시 문제를 위한 Map 자료구조를 써야겠다.
- Map 자료구조를 가지고, 옷이 종류 별로 몇 개가 있는지를 먼저 센다.
- 1에서 구한 값을 가지고, 옷을 어떻게 입는지 총 조합을 구하면 된다.
- 우선 값들에 1을 더한다.
- "상의"를 기준으로, 상의가 A,B,C 3개가 있을 때 상의를 입는 경우의 수는 [A, B, C, 입지 않는다.]로 총 3+1가지이다.
- 그리고 각 값들을 곱해준다.
- 그 곱에서 -1을 빼준다.
- 모두 입지 않는 경우의 수를 빼준 것이다.
- 우선 값들에 1을 더한다.
function solution(clothes){
const map = new Map();
let cnt= 1;
for(let [c,t] of clothes){
if(map.has(t)) map.set(t, map.get(t) + 1);
else map.set(t, 1);
}
for(let x of map.values()) cnt *= (x+1);
return cnt - 1;
}
코드 설명
- 우선 Map 자료구조로 map 변수를 생성한다.
- 그리고 경우의 수를 위한 cnt 변수를 생성하는데, 코드 아래에서 보면 알겠지만 cnt에 (개수+1) 을 곱해줘야 하기 때문에 cnt 변수의 값을 1로 초기화해야 한다.
- 입력 값 clothes 변수를 순회하면서 옷의 이름을 c, 옷의 종류를 t라고 선언한다.
- c는 필요가 없기 때문에, Map 자료구조의 has, set, get을 적절히 활용해서 종류 t가 존재하면 값+1, 존재하지 않으면 1로 생성한다.
- 변수 map에 key값이 존재하지 않을 수 있으므로, 먼저 if문을 가지고 해당 key를 가지고 있는지 검사해야 한다.
- 검사하지 않고
map.set(t, map.get(t)+1);
로 넣으면map.get(t)+1
부분이undefined + 1
로NaN
값이 들어간다.
- map에는
key : value
형태로"headgear" : 2
형태로 저장되어 있다. - Map.values 메서드를 이용해서 값만 순회하면서 기존의 cnt 변수에 (값+1)을 곱해준다.
- 리턴할 때 cnt 변수에서 아무것도 입지 않은 경우의 수에 해당하는 1을 빼준다.
맵 자료구조에 대해 더 공부하고 싶다면, Mozilla Map 을 참고하자.
'DS & Algorithm > programmers' 카테고리의 다른 글
[프로그래머스] 괄호 변환 - 자바스크립트 (0) | 2021.06.18 |
---|---|
[프로그래머스] 게임 맵 최단거리 - 자바스크립트 (0) | 2021.06.18 |
[프로그래머스] 땅따먹기 - 자바스크립트 (0) | 2021.06.18 |
[프로그래머스] 다리를 지나는 트럭 - 자바스크립트 (0) | 2021.04.19 |
[프로그래머스] 크레인 인형뽑기 게임 - 자바스크립트 (0) | 2021.04.19 |