2022. 7. 24. 18:13ㆍ알고리즘/programmers
그냥 딱 보기엔 쉬운데..
정말 정직한 마음가짐으로 조합하다보면 런타임 에러가 납니다.
모든 케이스를 통과하기 위해선 약간의 수학적인 팁이 필요합니다.
이건 다른 곳에서 쓸 일이 많겠다 싶어서 기록해두고자 합니다.
그럼 시작해볼까요?
문제 요약
스파이가 가진 의상들이 담긴 2차원 배열 clothes가 주어질 때 서로 다른 옷의 조합의 수를 return 하도록 solution 함수를 작성해주세요.
clothes | return |
[["yellow_hat", "headgear"], ["blue_sunglasses", "eyewear"], ["green_turban", "headgear"]] | 5 |
[["crow_mask", "face"], ["blue_sunglasses", "face"], ["smoky_makeup", "face"]] | 3 |
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
접근 방법
일단 옷의 카테고리 별로 나눠야겠다는 생각이 듭니다.
여기에서 중요한 점은 모든 옷이 다른 옷이라는 점입니다. 중복되는 옷이 없습니다.
결론적으로 정직하게 배열을 만들어서 넣는거는 메모리도, 또 나중에 처리하기에도 연산을 크게 먹습니다. 갯수만 세서 1을 더해주는 걸로 하겠습니다.
문제는 나중에 카테고리별로 총 경우의 수를 구해줘야합니다.
아래에서 설명드릴게요.
코드먼저 보겠습니다.
정답 코드
function solution(clothes) {
const combis = new Map();
clothes.forEach(v => {
if (combis.has(v[1])) {
const val = combis.get(v[1]);
combis.set(v[1], val + 1);
} else {
combis.set(v[1], 2);
}
});
let result = 1;
const values = [...combis.values()];
values.forEach((value, i, arr) => {
result *= value;
})
return result - 1;
}
팁 1. 모든 경우의 수 구하기
이 문제에서 말하는 경우의 수는 "각 카테고리 별로 가능한 모든 경우를 세줘야한다." 입니다.
옷을 하나만 입는 경우도 있고, 여러 개를 같이 입는 경우도 있죠. 갯수만 세주면 되는데 코드를 보면 그냥 곱해버립니다.
실제 카테고리보다 1을 더해준 값을 모두 곱한 값이 의미하는 건 아무것도 입지 않는 경우를 포함한 경우의 수를 말합니다.
그리고 모든 옷을 걸치지 않는 경우 딱 하나만 빼주면 정답을 얻을 수 있습니다.
간단한 수학을 통해 인생이 편해졌네요.
그렇다면 이만!
'알고리즘 > programmers' 카테고리의 다른 글
[JS] 큰 수 만들기 (0) | 2022.07.26 |
---|---|
[JS] H-Index 근데 이제 정렬을 곁들이지 않은... (0) | 2022.07.25 |
[JS] 2 x n 타일링 - 이거 왜 피보나치인지 알려드림! (0) | 2022.07.23 |
[JS] 배달 (0) | 2022.07.22 |
[JS] 괄호 회전하기 (0) | 2022.07.21 |