[프로그래머스/자바스크립트] 해시 - 위장

[프로그래머스/자바스크립트] 해시 - 위장

https://programmers.co.kr/learn/courses/30/lessons/42578

function solution(clothes) { var obj = clothes.reduce((accObj, [clothes, category]) => { accObj[category] = (accObj[category] || 0) + 1; return accObj; }, {}); var categoryList = Object.values(obj); var result = 1; categoryList.forEach((num) => { result *= num + 1; }); return result - 1; }

- 처음에 못 풀었었다. 코드가 어려웠던 것이 아니라 경우의 수 계산을 너무 어렵게 생각한 것이 원인이었다.

- 구현 방식은 사실 간단한 문제다.

카테고리 별로 옷을 조합한 경우의 수를 계산하는 것이기 때문에,

먼저 카테고리 별 옷의 갯수를 구해주고, 그 뒤에 경우의 수를 계산해주면 된다.

- 카테고리 별 옷의 갯수를 구하기: 입력이 들어오면, {카테고리명: 옷의 갯수} 형식으로 객체를 만들어주면 된다. 이때, reduce를 사용했다.

- 경우의 수 구하기: 옷이 몇 개인지만 알면 되고, 카테고리 이름이 뭔지는 중요하지 않으므로 Object.values() 로 옷의 갯수만 뽑아준다. 그 뒤에 경우의 수를 계산하는 식에 맞게 코드를 짜주면 된다.

- 여기서 내가 어려웠던 부분이자, 이 문제의 포인트는 경우의 수를 어떤 식으로 구할 것인가이다.

상의 5벌, 하의 3벌, 안경 2개 가 있다고 가정해보자.

만약 각 카테고리 별로 하나씩 골랐을 때 경우의 수는 5*3*2 이다.

그러나 이 문제는 3개의 카테고리를 모두 고를 필요는 없고 1개의 카테고리만 골라도 되고, 2개의 카테고리만 골라도 된다. 단, 적어도 하나의 카테고리는 골라줘야 한다는 조건이 붙는다. (옷을 아예 안 입으면 정말 곤란해~~~~~~~~~~)

그러므로 경우의 수는 각 카테고리 별로 '고르지 않는다'는 선택지가 하나 더 있으므로,

(5벌의 상의 + '고르지 않는다') * (3벌의 하의 + '고르지 않는다') * (2개의 안경 + '고르지 않는다')

즉, (5+1) * (3+1) * (2+1) 이 될 것이다.

단, 이 경우에는 모두 고르지 않은 경우 (상의, 하의, 안경 모두 '고르지 않는다'를 선택한 1가지의 경우)가 존재하기 때문에 이 경우를 제외시켜줘야 한다.

최종적으로 (5+1) * (3+1) * (2+1) 에서 1을 빼주면 된다.

- 코드가 어떻고, 이걸 구현하는 데 어떤 메서드를 쓸 거고 등등 너무 중요하지만

이렇게 간단한 경우의 수를 구하는 아이디어를 못 떠올리니 온갖 메서드들이 다 무용지물이더라...

학교 다닐 때 순열 조합 진짜 싫어했는데 성인이 되고서도 발목 잡히니까 기분이 정-말 묘-하게 정-말정-말 나빴음ㅋㅋ

from http://ghebal.tistory.com/24 by ccl(A) rewrite - 2021-11-04 23:27:40