https://programmers.co.kr/learn/courses/30/lessons/42578
1. 문제에 대한 이해
- 우리가 풀어야 할 문제는 무엇인가?
- 스파이가 옷을 겹치지 않게 몇번 조합해서 입을 수 있는지를 구하라. - 주어진 자료는 무엇인가?
- 스파이의 의상이 담긴 2차원배열 clothes - 조건은 무엇인가?
- 옷을 입을 때 의상 종류가 겹치면 안된다.
- 최소 옷 하나는 입어야댐
- 같은 이름을 가진 옷은 없다.
2. 계획
- 이 문제를 푸는데 있어서 유용하게 쓸 수 있는 지식은 무엇인가?
- 2차원 배열을 어떻게 다룰 수 있는가
3. 실행
- 풀이 계획을 실행하고, 각 단계가 올바른지 점검하라.
const solution = (clothes) => {
//2차원 배열을 의상종류를 기준으로해서 객체로 나타내자
const objClothes = clothes.reduce((prev, row) => {
const [clothe, kind] = row;
prev[kind] = [...(prev[kind] || []), clothe];
return prev;
}, {});
//객체 키가 하나일때는 그냥 바로 value 길이를 리턴
if (Object.keys(objClothes).length === 1) {
return Object.values(objClothes)[0].length;
}
//(a+1)(b+1)(c+1)
//abc + ab + bc+ ac + a+ b+ c+1
const result = Object.values(objClothes).reduce((acc, curr) => (curr.length+1)*acc, 1);
return result - 1;
}
의상 종류를 기준으로 옷 이름을 알 수 있도록 (상의 : 노란색티셔츠 이런식으로) 나타내고 싶어서
주어진 2차원 배열을 객체로 나타내주었다.
clothes라는 2차원 배열에 reduce를 적용한다. 초기값은 빈 객체.
const objClothes = clothes.reduce((prev, row) => {} ,{}};
row는 [옷종류, 옷이름] 이런식으로 나타내도록 변수를 만들었다.
const [clothe, kind] = row;
kind에 해당하는 key에 value를 넣어줄건데 prev[kind]에 이미 데이터가 존재하면 스프레드 연산자로 펼쳐주고
없다면 빈 배열을 펼쳐준다(아무것도 안넣어준다).
그 다음에 이걸 clothe에 담아준다.
prev[kind] = [...(prev[kind] || []), clothe];
그리고 주어진 입출력 예제를 봤는데 옷의 종류가 하나인 경우가 있었다.
그래서 객체의 key(옷의종류)가 하나인 경우는 그냥 value(옷이름)의 길이를 리턴해주었다.
if (Object.keys(objClothes).length === 1) {
return Object.values(objClothes)[0].length;
}
그 다음에 이제 스파이가 옷을 입을 수 있는 경우의 수를 구해야되는데
예를 들어서,
상의: a, b, c , d(총4벌)
하의: e, f (총2벌)
안경: g, h (총2벌)
이렇게 주어진 경우, 경우의 수를 구해보면
상의&하의&안경 다 입는 경우 : 4x2x2
상의&하의 입는 경우: 4x2
하의&안경 : 4x2
상의&안경: 4x2
상의만 입는 경우: 4
하의 : 2
안경: 2
해서 다 더해주면 된다.
(4x2x2)+(4x2)+(4x2)+(4x2)+4+2+2
근데 수학 다항식 계산 공식으로 생각해보니까
(a+1)(b+1)(c+1)-1
= (abc + ab + bc+ ac + a+ b+ c+1) -1
하는거랑 똑같다.
그래서
(a+1)(b+1)(c+1)-1
이 공식을 적용해서 풀어보면
(a+1)(b+1)(c+1) 이 부분은
const result = Object.values(objClothes).reduce((acc, curr) => (curr.length+1)*acc, 1);
이렇게 나타낼 수 있고
뒤에 -1을 해줘야하니까
return result - 1;
'코테연습' 카테고리의 다른 글
53. 문자열압축 Javascript (0) | 2022.05.27 |
---|---|
52. K번째수 Javascript (0) | 2022.05.25 |
50. 소수 만들기 javascript (0) | 2022.05.24 |
49. 완주하지 못한 선수 (0) | 2022.05.24 |
48. 내적 (0) | 2022.05.19 |
댓글