프로그래머스 LEVEL 2(연속된 부분 수열의 합)
-
사용 언어 : javascript
-
해결 날짜 : 2023-04-23
-
해결 방법 :
- 완전 탐색을 통해 문제 해결
- 연속 부분 수열의 시작 인덱스와 끝 인덱스를 큐에 저장
- 현재까지의 합에 현재 숫자를 더했을 때 k보다 작거나 같다면 끝 인덱스 증가
- 이 때 큐에 저장된 시작 인덱스와 끝 인덱스가 현재 i와 같다면 증가 x
- k보다 크다면 작거나 같아질 때 까지 시작 인덱스 증가
- 현재 숫자에 대한 처리 후 sum과 k가 같다면 answer에 push
- 완전 탐색을 통해 문제 해결
-
회고 :
- sequence의 길이가 1,000,000 이므로 O(n)에 문제를 해결해야 했다.
-
따라서 처음에 연속 부분 수열의 시작 인덱스와 끝 인덱스를 큐에 저장하는 방식으로 작성했다.
function solution(sequence, k) { const answer = []; const q = []; let sum = 0; sequence.forEach((number, i) => { if (sum + number < k) { sum += number; if (q.length !== 2) { q.push(i); } else { q[1] += 1; } } else if (sum + number > k) { sum += number; q[1] += 1; while (sum > k) { sum -= sequence[q[0]]; q[0] += 1; } } else { q[1] += 1; answer.push([...q]); sum += number; return; } if (sum === k) { answer.push([...q]); return; } }); return answer.sort((a, b) => (a[1] - a[0] < b[1] - b[0] ? -1 : 1))[0]; }
-
그러나 테스트 케이스 중 4개를 통과하지 못했다..
-
곰곰이 생각해보니 [0, 0]일 때 k를 만족하는 경우에 대한 처리를 해주지 않았고, 이를 코드에 적용했더니…. 성공!!
- 그 후 코드를 더 간소화할 수 있을 것 같아 수정했다. 최종 코드는 아래와 같다!
-
코드
function solution(sequence, k) { const answer = []; const q = [0, 0]; let sum = 0; sequence.forEach((number, i) => { sum += number; if (sum <= k) { if (q[1] !== i || q[0] !== i) { q[1] += 1; } } else if (sum > k) { q[1] += 1; while (sum > k) { sum -= sequence[q[0]]; q[0] += 1; } } if (sum === k) { answer.push([...q]); } }); return answer.sort((a, b) => (a[1] - a[0] < b[1] - b[0] ? -1 : 1))[0]; }
-
출처: 프로그래머스 코딩 테스트 연습, https://school.programmers.co.kr/learn/challenges