개발 블로그

[프로그래머스/Javascript/Hash] 위장 본문

IT/Programmers

[프로그래머스/Javascript/Hash] 위장

파티에 2021. 4. 11. 23:18

1. 문제 설명(출처: programmers.co.kr/learn/courses/30/lessons/42578)

2. 문제 풀이
1) '완주하지 못한 선수'와 유사하게 여러 종류의 옷들이 있지만 같은 종류의 옷은 중복해서 입을 수 없으므로 hash map에 종류별로 옷의 갯수를 count한다면 이 문제는 중복 조합 문제로 바뀌게 된다. 따라서 이 문제의 답 공식 = (옷(얼굴) + 1) x (옷(상의) + 1) x (옷(하의) + 1) x  (옷(겉옷) + 1)) - 1이 된다.( +1은 입지 않은 경우, -1은 아무것도 입지 않은 경우)
2) 모든 종류의 옷을 각각 돌아가면서 아래 명령을 수행한다.
  2-1) 만약 이미 map에 존재하는 옷의 종류라면 
     2-1-T1) 해당 옷 종류의 갯수를 +1 해준다.
     2-1-F1) 해당 옷 종류를 (옷 종류, 1) 형태로 map에 저장한다.
3) (옷(종류) + 1)를 반복적으로 계산하기 위해 reduer를 사용한다.
4) hmap에 있는 옷 종류별 갯수를 배열의 형대로 reduer함수를 적용하고, 아무것도 입지 않은 경우 1을 뺀다.

3. 결과 코드

function solution(clothes) {
  var hmap = new Map()
  for(let clothe of clothes){
    if(hmap.has(clothe[1])){
      hmap.set(clothe[1], hmap.get(clothe[1])+1)
    }else{
      hmap.set(clothe[1], 1)
    }
  }
  const reducer = (accumulator, currentValue) => accumulator * (currentValue + 1)
  return [ ...hmap.values() ].reduce(reducer, 1) - 1
}