프로그래머스 - 위장

아놀드·2021년 7월 29일
0

프로그래머스

목록 보기
6/52

1. 문제

문제 링크


2. 풀이

2-1. 조건

  1. 스파이는 하루에 최소 한 개의 의상은 입는다.

2-2. 풀이

수학적 사고를 이용하는 경우의 수 문제입니다.
카테고리 별로 옷 개수를 카운팅을 하고
그 카운팅을 모두 곱하는 식으로 풀면 될 거 같습니다.

예를 들어서
썬글라스 - 3개
바지 - 6개
상의 - 3개
이렇게 있다고 가정을 해봅시다.

조합 공식에 의하면
썬글라스를 고르는 경우의 수 x 바지를 고르는 경우의 수 x 상의를 고르는 경우의 수
즉 경우의 수는 3 x 6 x 3 = 54 가 되겠죠?

하지만 이렇게 조합을 구하게 되면 답을 구할 수 없게 됩니다.
1번 조건, 그리고 예시를 보면 옷을 하나만 입어도 경우의 수로 카운팅을 할 수 있죠.
그렇다면 각 카테고리별로 옷을 입지 않은 날도 있을테니
입지 않은 경우의 수를 더해줘서 곱해야합니다

썬글라스 - 3개(썬글라스를 고르는 경우의 수) + 1개(썬글라스를 안 고른 경우의 수)
바지 - 6개(바지를 고르는 경우의 수) + 1개(바지를 안 고른 경우의 수)
상의 - 3개(상의를 고르는 경우의 수) + 1개(상의를 안 고른 경우의 수)
즉 경우의 수는 4 x 7 x 4 = 112가 됩니다.

하지만 역시 이 결과도 정답이 아닙니다!
눈치 빠르신 분들은 알아채셨겠죠?
이렇게 조합을 하면 아무것도 안 고른 경우의 수도 존재하기 때문에
답에서 -1을 해줘야합니다.
고로 정답은 111이 됩니다.

총 정리를 해보면
1. 카테고리 별로 옷을 카운팅합니다.
2. 각 카운팅 개수에 +1 한 값들을 다 곱합니다.
3. 다 곱한 값에 1을 뺍니다.

3. 전체 코드

function solution(clothes) {
    return Object.values(clothes.reduce((m, v) => {
        // 1. 카테고리 별로 옷을 카운팅합니다.
        m[v[1]] = m[v[1]] ? m[v[1]] + 1 : 1;
        return m;
            // 2. 각 카운팅 개수에 +1 한 값들을 다 곱합니다.
            // 3. 다 곱한 값에 1을 뺍니다.
    }, {})).reduce((m, v) => m *= (v + 1), 1) - 1;
}
profile
함수형 프로그래밍, 자바스크립트에 관심이 많습니다.

0개의 댓글