작성 코드 (1차 시도 / 통과)
function solution(sequence, k) {
let [l, r] = [0, 0]
let summed = sequence[l] // 현재 쌓여있는 합 (l~r위치 값의 합)
const candidate = [] // 답안 후보
while (r < sequence.length) {
if (summed < k) summed += sequence[++r] // 합이 k보다 작으면 r이동
else if (summed > k) summed -= sequence[l++] // 합이 k보다 크면 l이동
else { // 합이 k라면 후보에 넣고 r과 l이동
candidate.push([l, r])
summed += sequence[++r]
summed -= sequence[l++]
}
}
// 후보 중 가장 차가 적은 것을 리턴
return candidate.sort((a, b) => (a[1] - a[0]) - (b[1] - b[0]))[0]
}
구현 로직(투 포인터)
1. 시작 위치 값 지정 l = 0, r = 0
2. summed에 초기 값 넣기
3. summed의 값에 따라 포인터 이동
3-1. summed가 k보다 작으면(값을 추가해줘야 하므로) -> r포인터 이동
3-2. summed가 k보다 크면(값을 뺴줘야 하므로) -> l포인터 이동
3-3. summed가 k라면 후보에 넣고 이미 방문한 자리이므로 l과 r각각 이동
4. 후보 중 인덱스 차가 가장 적은 것을 리턴