스파이는 매일 다른 옷을 조합하여 입어 자신을 위장합니다.
| 종류 | 이름 |
|---|---|
| 얼굴 | 동그란 안경, 검정 선글라스 |
| 상의 | 파란색 티셔츠 |
| 하의 | 청바지 |
| 겉옷 | 긴 코드 |
위의 표처럼 옷이 있다고 하면 [(동그란 안경, 파란색 티셔츠) , (파란색 티셔츠, 청바지)(청바지)...] 이런 씩으로 종류별로 하나씩 혹은 입지 않고 입었을 때의 총 조합의 갯수를 구하는 것이다. 단, 아무 것도 입지 않는 경우는 없다.
function solution(clothes) {
let clothesType = {}
let sum = 1
// 1. clothes에 배열의 요소를 key = 종류, values = 옷이름으로 지정해주는 배열을 만든다.
for (let i of clothes){
if(clothesType[i[1]] === undefined) clothesType[i[1]] = [i[0]]
else clothesType[i[1]].push(i[0])
}
// 2. 모든 경우의 수 모든 가지수의 갯수를 곱한다. +1은 입지 않았을 때를 말한다.
for(let key in clothesType){
sum *= clothesType[key].length+1
}
// 모든 옷을 입지 않는 경우의 수는 없으니, 모든 경우의 수에서 1을 뺀다.
return sum-1
}
| clothes | return |
|---|---|
| [["yellow_hat", "headgear"], ["blue_sunglasses", "eyewear"], ["green_turban", "headgear"]] | 5 |
// 해시 테이블
const clothesType = {'headgear' : 'yellow_hat',
'eyewear' : 'blue_sunglasses', ...
}
{종류: 옷이름}으로 해시 테이블을 만들어준다.( 순열: 만일 집에서 학교까지 가는 길이 3가지이고, 도서관에 가는 길이 2가지이면, 집에서 학교를 거쳐 도서관에 가는 길은 3*2=6 이 된다.)
function solution(clothes) {
const map = new Map()
let sum = 1
// 1
for (let i of clothes){
if(map.get(i[1]) === undefined) map.set(i[1] , [i[0]])
else map.get(i[1]).push(i[0])
}
// 2
for(let key of map.keys()){
sum *= map.get(key).length+1
}
return sum-1
}
객체로 풀었던 것과 거의 같은 느낌이지 해시에서 Set,Map으로 많이 풀기 때문에 Map으로도 풀어 보았고, 만일 입력값이 더욱 많아지는 경우에는 map을 통해서 시간 단축 및 데이터를 자유롭게 찾고, 넣을 수 있는 장점이 있어서 map을 이용해 풀어보았다.
map.get을 통해서 옷의 종류가 없을 경우 map.set을 통해 Map(해시테이블)에 넣어준다.map.get을 통해 해당되는 옷 종류의 배열을 가져와 담아준다.map.set()을 통해 담는 시도를 하게 되면 배열이 계속해서 초기화가 된다.)이번 해시를 통해 Map,Set의 사용의 편리함을 많이 느꼈고, Map,Set을 조금 더 공부해서 다양하게 써먹으면 편리할 것 같다!