알고리즘, 자료구조/프로그래머스
[Javascript] 프로그래머스 - 위장
jaee
2022. 9. 19. 22:22
문제: https://school.programmers.co.kr/learn/courses/30/lessons/42578?language=javascript#
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제요약
- 스파이는 위장을 위해 매일 다른 옷을 조합하여 입어야 한다. 서로 다른 옷의 조합의 수를 구하여라.
- 스파이는 하루에 최소 1개 이상의 의상을 입는다.
- clothes는 2차원 배열이며, 원소는 [의상의 이름, 의상의 종류]로 구성된다.
- 스파이가 가진 의상의 수는 1개 이상 30개 이하이며, 의상의 이름은 고유하다.
풀이과정
function solution(clothes) {
let answer = 1;
// 종류별로 의상 개수 카운팅
const clothesObj = clothes.reduce((prev, curr) => {
prev[curr[1]] = (prev[curr[1]] || 1) + 1;
return prev;
}, {});
// 각 종류의 의상 개수를 곱해준다
for (let key in clothesObj) {
answer *= clothesObj[key];
}
// 아무것도 착용하지 않는 경우는 없으므로, -1을 해준다
return answer - 1;
};
그림으로 그리면 아래와 같다. key는 의상 종류의 이름이고 value는 해당 종류에 속하는 의상의 이름들로 이루어진 배열이다. 각 배열에는 의상의 이름만 있는게 아니다. 해당 종류의 의상을 입지 않는 경우도 포함한다. 이렇게 구성된 각 배열의 길이(= 종류별 의상 개수)를 서로 곱한다. 최종적으로 곱한 값에서 -1을 해야한다. 아무 의상도 착용하지 않은 경우는 없기 때문이다. (문제 조건에서 최소 1개 이상의 의상을 입는다고 되어있다)