N개의 자연수로 구성된 수열이 있을 때, 합이 M인 부분 연속 수열의 개수 구하기. 수행 제한 시간은 O(N)
시작점(start)과 끝점(end)이 첫 번째 원소의 인덱스(0)를 가리키도록 한다.
현재 부분 합이 M과 같다면, 카운트한다.
현재 부분 합이 M보다 작다면, end를 1 증가시킨다.
현재 부분 합이 M보다 크거나 같다면, start를 1 증가시킨다.
모든 경우를 확인할 때 까지 2~4 과정을 반복한다.
문제에 따라 구현되는 방식이 조금씩 다를 수 있다.
위 과정을 끝까지 반복하면 된다.
const n = 5; // 데이터의 개수
const m = 5; // 찾고자 하는 부분합
const arr = [1, 2, 3, 2, 5];
let count = 0;
let intervalSum = 0;
let end = 0;
// start를 차례대로 증가시키며 반복
for (let start = 0; start < n; start++) {
// end를 가능한 만큼 이동시키기
while (intervalSum < m && end < n) {
intervalSum += arr[end];
end += 1;
}
// 부분합이 m일 때 카운트 증가
if (intervalSum == m) {
count += 1;
}
intervalSum -= arr[start];
}
console.log(count);
연습문제
백준 실버 4 https://www.acmicpc.net/problem/2003
공통문제
백준 실버 3 https://www.acmicpc.net/problem/28353
or
백준 골드 5 https://www.acmicpc.net/problem/2470