개발로그필름
[프로그래머스/js] 의상 본문
https://school.programmers.co.kr/learn/courses/30/lessons/42578?language=javascript
이 문제에서 핵심은 '조합'을 구하는 것
가진 의상들이 배열로 주어졌을 때 서로 다른 옷의 조합이 얼마나 있는지 알아보는게 먼저다
조합을 구해본지 오래되어서 처음에는 조금 헤맸지만? 주어진 배열의 조합을 구하다보니 어떤 규칙인지 눈에 보였다
처음 입출력의 예를 보자
[["yellow_hat", "headgear"], ["blue_sunglasses", "eyewear"], ["green_turban", "headgear"]]
headgear에는 2가지, eyewear에는 1가지가 있다
총 조합의 수는 5가지
왜?
headgear1, headgear2, eyewear1, h1 e1, h2 e2 ==> 총 5가지
하지만 컴퓨터는 나처럼 매번 세서 구할 수 없는 멍텅구리이기 때문에 내가 이 과정을 일반화해서 수식으로 입력해주어야 한다^^
예전에 조합 배울때 곱하고 뺐던 기억이 스멀스멀 나기 시작해서 적용해본다
원래의 조합은 3가지 * 2가지 = 6가지이다 근데 왜 5가지냐?!
문제에서 한 개 이상의 옷은 입는다는 조건이 있으므로 아예 아무것도 안 입는 경우의 수는 빼야한다는 사실!
그래서 5가지가 나온것
그럼 이제 일반화한 수식을 만들어 낼 수 있겠지..?
자, 이제 코드를 작성해봅시돠
의상이 배열로 주어졌다는 점에서 key:value로 접근해서 문제를 풀기로 한다
현재 clothes 배열이 아래와 같이 주어지니까 종류별로 개수를 알고 싶다. 이게 이 문제의 핵심이니깐!
const clothes = [
["yellow_hat", "headgear"],
["blue_sunglasses", "eyewear"],
["green_turban", "headgear"]
];
그래서 {} 빈 객체를 선언하고 여기에 옷의 종류별 개수를 저장하려고 한다
const clothesMap = {};
clothes.forEach(item => {
// item[0]은 옷 이름
// item[1]은 옷 종류
const type = item[1];
if (clothesMap[type]) {
clothesMap[type] += 1; // clothesMap에 있으면 +1
} else {
clothesMap[type] = 1; // 없으면 1
}
});
이렇게 하면 clothesMap에 clothesMap = { headgear: 2, eyewear: 1 }; 이런식으로 저장이 되게 된다
이제 조합을 구해봅시다
let combinations = 1; // 곱해야해서 1로 초기화
// 의상 종류별로 반복
for (const type in clothesMap) { // type은 headgear나 eyewear같은 key
// 앞서 조합 구할 때 옷 개수 + 입지 않는 경우 구했으니까 수식으로 아래와 같이 표현
combinations *= (clothesMap[type] + 1); // 해당 종류의 옷 개수 + 입지 않는 경우(1)
}
// 아무것도 입지 않는 경우 하나를 빼줌
combinations -= 1;
최종 코드
function solution(clothes) {
const clothesMap = {};
clothes.forEach(item => {
const type = item[1];
if(clothesMap[type]) {
clothesMap[type] += 1;
} else {
clothesMap[type] = 1;
}
})
let combinations = 1;
for(const type in clothesMap) {
combinations *= (clothesMap[type]+1);
}
combinations -= 1;
return combinations;
}
휴^^^^^^ 푸느라 한세월 걸렸네,,,,;;; 코딩테스트 언제 잘해,,,, 흑 ㅠㅠㅠㅠ
'coding test > 프로그래머스' 카테고리의 다른 글
[프로그래머스/js] 부분 문자열 이어 붙여 문자열 만들기 (0) | 2024.04.20 |
---|---|
[프로그래머스/js] 홀수 vs 짝수 (1) | 2024.04.20 |
[프로그래머스/js] 배열의 원소만큼 추가하기 (0) | 2024.04.19 |
[프로그래머스/JS] 배열의 원소 삭제하기 (0) | 2024.04.19 |
[프로그래머스/JS] 접두사인지 확인하기 (0) | 2024.03.27 |