[프로그래머스/해시/3] 위장 (JS)

진문장·2021년 5월 16일
0

출처: 프로그래머스 코딩테스트 해시 3번째 문제
(https://programmers.co.kr/learn/courses/30/lessons/42578?language=javascript)

문제 설명

스파이들은 매일 다른 옷을 조합하여 입어 자신을 위장합니다.

스파이가 가진 의상들이 담긴 2차원 배열 clothes가 주어질 때 서로 다른 옷의 조합의 수를 return 하도록 solution 함수를 작성해주세요.

제한사항

  • clothes의 각 행은 [의상의 이름, 의상의 종류]로 이루어져 있습니다.
  • 스파이가 가진 의상의 수는 1개 이상 30개 이하입니다.
  • 같은 이름을 가진 의상은 존재하지 않습니다.
  • clothes의 모든 원소는 문자열로 이루어져 있습니다.
  • 모든 문자열의 길이는 1 이상 20 이하인 자연수이고 알파벳 소문자 또는 '_' 로만 이루어져 있습니다.
  • 스파이는 하루에 최소 한 개의 의상은 입습니다.

풀이 방법

  1. 의상의 종류만을 배열로 만든다.
  2. 1번에서 만든 배열에서 중복을 제거한 배열을 만든다. 이렇게 되면 의상의 종류만을 담은 배열이 완성된다.
  3. 만든 배열을 통해서 그 종류에 맞는 의상 수를 원본 배열에서 가져온 후 안 입는 경우를 산정해 1을 더해주고 산출된 값들을 계속 곱해 나간다.
  4. 결국 모든 조합의 가짓수가 산출된다. 하지만 하나도 안입는 경우는 없기때문에 -1을 하여 최종 결과를 리턴한다.

소스 코드

function solution(clothes) {
    const keys = clothes.map( el => el[1])
    return keys.filter( (el,idx) => keys.indexOf(el) === idx )
        .reduce((acc,cur) => (
            acc * (clothes.filter( el => el[1] === cur ).length + 1)
        ),1) - 1;
}

후기

처음에는 조합 알고리즘을 이용해 하나씩 선택해가며 모든 조합의 종류를 산출한 후 가짓수를 계산했는데 너무 오래걸렸었다.
그러던 중 질문하기 코너에서 안 입는 것도 하나의 가짓수로 산정하라는 팁을 듣고 나서 간단하게 풀 수 있었다.

0개의 댓글