https://school.programmers.co.kr/learn/courses/30/lessons/131705
1. 문제에 대한 이해
- 우리가 풀어야 할 문제는 무엇인가? 학생들 중 삼총사를 만들 수 있는 방법의 수를 구하라
- 주어진 자료는 무엇인가? 학생들의 번호를 나타내는 정수 배열
- 조건은 무엇인가? 서로 다른 학생의 정수 번호가 같을 수 있다.
2. 계획
1. 주어진 number를 순회한다.
2. 첫번째 인덱스 + 두번째 인덱스 + 세번째 인덱스 가 0이 아니라면 세번째인덱스+1을하면서 순회하는데 number 끝까지 다 순회했다면
3. 첫번째 인덱스 + 두번째 인덱스+1 + 그 다음인덱스가 세번째 인덱스 가 0이 아니라면 세번째 인덱스+1을 하면서 순회한다.
4. 2,3을 반복하다가 두번째 인덱스가 number배열 마지막에 위치하게 되면 첫번째 인덱스+1 + 그다음인덱스가 두번째인덱스 + 두번째인덱스의 다음인덱스가 세번째인덱스 라고 정한다.
5. 2,3 반복
2,3,4,5를 반복하다가 0이 나오면 그 값을 count+1한다.
3. 실행
const solution = (number) => {
let count = 0;
for (let i = 0; i < number.length - 2; i++) {
for (let j = i + 1; j < number.length - 1; j++) {
for (let k = j + 1; k < number.length; k++) {
if (number[i] + number[j] + number[k] === 0) {
count += 1;
}
}
}
}
return count;
};
4. 반성
- 조합을 이용해서 풀어보았다.
const solution = (number) => {
const combinations = getCombinations(number, 3);
return sum(combinations);
}
// 주어진 배열 number에서 3개의 숫자만을 골라서 새로운 배열로 리턴하는 조합 함수
const getCombinations = (number, fixedNum) => {
let result = [];
if (fixedNum === 1) {
return number.map((it) => [it]);
}
number.forEach((fixed, index, origin) => {
const rest = origin.slice(index + 1);
const combination = getCombinations(rest, fixedNum - 1);
const attached = combination.map((it) => [fixed, ...it]);
result.push(...attached);
})
return result;
}
// 세개씩 조합된 배열의 숫자들을 더했을 때 결과 값이 0인 개수 구하는 함수
const sum = (combinations) => {
return combinations.map((it) => it.reduce((acc, cur) => acc + cur), 0).filter((sum) => sum === 0).length;
}
test('solution', () => {
expect(solution([-2, 3, 0, 2, -5])).toEqual(2);
});
'코테연습' 카테고리의 다른 글
184. 푸드파이트 대회 Javascript (2) | 2023.03.12 |
---|---|
183. 개인정보 수집 유효기간 Javascript (0) | 2023.02.10 |
181. 기사 단원의 무기 Javascript (0) | 2023.01.25 |
180. 크기가 작은 부분 문자열 Javascript (0) | 2023.01.20 |
179. 옹알이 Javascript (0) | 2023.01.20 |
댓글