문제
각 의상 종류별로 최대 1가지 의상만 착용할 수 있고, 서로 다른 옷의 조합을 할 때 주어진 의상 목록으로 매일 다른 스타일을 즐기려면 몇 가지 방법이 있을지 구하여라
풀이
function solution(clothes) {
var answer = 1;
var categories = {};
clothes.forEach((cloth) => {
var category = cloth[1];
console.log(category)
categories[category] = (categories[category] || 0) + 1;
});
Object.values(categories).forEach((count) => {
answer *= count + 1;
});
return answer - 1;
}
- category cloth[1]
- cloth 배열의 구조가 [의상이름, 의상종류] 순서로 되어 있다. category cloth[1]은 의상 종류를 뜻함
- categories[category]
- categories[category] 현재 의상 종류 (category)에 해당하는 개수를 가져온다
- || 0 만약 해당 의상 종류에 대한 개수가 존재하지 않으면 (undifined 또는 false) 면 0으로 대체
- 아니면 +1
- 다시 categories 객체에 저장
- Object ...
- 각 의상 종류별로 (해당 의상을 입지 않을 경우도 포함?) 입을 수 있는 경우의 수 계산
- 해당 의상을 입지 않을 경우 포함하기 위해 +1
- 모든 의상을 입지 않을 경우는 제외 answer --;
다른 풀이
function solution(clothes) {
return Object.values(clothes.reduce((obj, t)=> {
obj[t[1]] = obj[t[1]] ? obj[t[1]] + 1 : 1;
return obj;
} , {})).reduce((a,b)=> a*(b+1), 1)-1;
}
- reduce
- 의상 배열을 순회하고 의상 종류별로 개수를 센다
- obj[t[1]] 현재 의상 종류 t[1]에 대한 개수를 나타냄 해당 종류가 이전에도 등장했다면 1 초기화 아니면 개수 1 증가
- values
- 객체값을 배열로 가져옴
- reduce
- a는 현재까지의 총 경우의 수를 나타냄 b는 각 의상 종류별로 ㄴ개수를 나타냄
- a * (b + 1)은 해당 의상 종류를 입지 않을 경우 포함한 경우의 수를 곱
- -1 해서 모든 의산 입지 않는 경우 제외
function solution(clothes) {
const types = {};
for(const [style, type] of clothes){
if(type in types) types[type] +=1;
else types[type] = 1;
}
let sum = 1;
for(const type in types) sum *= (types[type] + 1)
return sum -1;
}
'기초다지기 > JS 코딩테스트' 카테고리의 다른 글
javaScript 과일 장수 (0) | 2024.01.18 |
---|---|
javaScript 캐시 계산 (0) | 2024.01.15 |
javaScript 2차원 배열 자르기 문제 (1) | 2024.01.11 |
javaScript 분수 덧셈 (1) | 2024.01.10 |
javaScript 연속된 정수의 합 (1) | 2024.01.09 |