문제 설명
스파이들은 매일 다른 옷을 조합하여 입어 자신을 위장합니다.
예를 들어 스파이가 가진 옷이 아래와 같고 오늘 스파이가 동그란 안경, 긴 코트, 파란색 티셔츠를 입었다면 다음날은 청바지를 추가로 입거나 동그란 안경 대신 검정 선글라스를 착용하거나 해야 합니다.
종류 이름
얼굴 | 동그란 안경, 검정 선글라스 |
상의 | 파란색 티셔츠 |
하의 | 청바지 |
겉옷 | 긴 코트 |
스파이가 가진 의상들이 담긴 2차원 배열 clothes가 주어질 때 서로 다른 옷의 조합의 수를 return 하도록 solution 함수를 작성해주세요.
제한사항
- clothes의 각 행은 [의상의 이름, 의상의 종류]로 이루어져 있습니다.
- 스파이가 가진 의상의 수는 1개 이상 30개 이하입니다.
- 같은 이름을 가진 의상은 존재하지 않습니다.
- clothes의 모든 원소는 문자열로 이루어져 있습니다.
- 모든 문자열의 길이는 1 이상 20 이하인 자연수이고 알파벳 소문자 또는 '_' 로만 이루어져 있습니다.
- 스파이는 하루에 최소 한 개의 의상은 입습니다.
입출력 예
clothes return
[[yellow_hat, headgear], [blue_sunglasses, eyewear], [green_turban, headgear]] | 5 |
[[crow_mask, face], [blue_sunglasses, face], [smoky_makeup, face]] | 3 |
입출력 예 설명
예제 #1
headgear에 해당하는 의상이 yellow_hat, green_turban이고 eyewear에 해당하는 의상이 blue_sunglasses이므로 아래와 같이 5개의 조합이 가능합니다.
1. yellow_hat 2. blue_sunglasses 3. green_turban 4. yellow_hat + blue_sunglasses 5. green_turban + blue_sunglasses
예제 #2
face에 해당하는 의상이 crow_mask, blue_sunglasses, smoky_makeup이므로 아래와 같이 3개의 조합이 가능합니다.
1. crow_mask 2. blue_sunglasses 3. smoky_makeup
소스
function solution(clothes) {
let answer = 1
const result = {};
clothes.forEach((v) => {
result[v[1]] = (result[v[1]] || 0) + 1;
});
const count = Object.values(result)
count.forEach((v) => {
answer *= (v + 1)
})
return answer - 1;
}
부족했던 점
1. 맨 처음엔 단순히 의상 종류별로 개수를 세어 그 값을 곱하는 것이 정답이라고 생각했다. 하지만 문제를 보면 의상 종류별로 무조건 하나씩 입어야 하는게 아니라 입지 않을 수도 있다. 가령 상의를 입지않고 하의와 신발만 신거나, 하의를 입지 않고 상의와 신발만 신는다거나 하는 경우가 있을 수 있다.
예를들어 상의 2벌, 신발4 켤레, 하의 3벌이 있을 경우 모두 선택할 수 있는 경우는 2 * 4 * 3 이 맞다. 하지만. 문제와 같이 각각 의상 종류에 대해 입지 않는 경우가 있기 때문에 + 1 씩 해준다 (2 + 1) * (4 + 1) * (3 + 1) 하지만 여기서 끝난게 아니라, 입지 않는 경우가 각각 1개씩 추가 되었기 때문에 모두 안입는 경우도 1개가 생긴다. 하지만 이는 문제 조건에 맞지 않으므로 1을 빼 준다.
'Algorithm' 카테고리의 다른 글
(프로그래머스) 짝지어 제거하기 (0) | 2021.02.19 |
---|---|
(프로그래머스) 사전 부분문자열 (0) | 2021.02.19 |
(프로그래머스) 멀쩡한 사각형 - JS (0) | 2021.01.22 |
(프로그래머스) 소수 찾기 (0) | 2021.01.21 |
(프로그래머스) 문자열 다루기 기본 (0) | 2021.01.21 |
댓글