투포인터 문제풀이5(수들의 합 2- 2003)

Minji Lee·2024년 2월 20일
0

JS코딩테스트

목록 보기
60/122
post-thumbnail

5. 수들의 합 2(2003)

https://www.acmicpc.net/problem/2003

문제

N개의 수로 된 수열 A[1], A[2], …, A[N] 이 있다. 이 수열의 i번째 수부터 j번째 수까지의 합 A[i] + A[i+1] + … + A[j-1] + A[j]가 M이 되는 경우의 수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 N(1 ≤ N ≤ 10,000), M(1 ≤ M ≤ 300,000,000)이 주어진다. 다음 줄에는 A[1], A[2], …, A[N]이 공백으로 분리되어 주어진다. 각각의 A[x]는 30,000을 넘지 않는 자연수이다.

출력

첫째 줄에 경우의 수를 출력한다.

작성한 코드

let fs = require("fs");
let input = fs.readFileSync("/dev/stdin").toString().split("\n");

const [n, m] = input[0].split(" ").map(Number);
const arr = input[1].split(" ").map(Number);

let cnt = 0; // 경우의 수

for (let start = 0; start < n; start += 1) {
  let end = start; // 끝점은 시작점과 동일하게 시작
  let accumulate = 0;
  while (end < n) {
    accumulate += arr[end];
    // 합이 m을 넘은 경우
    if (accumulate > m) break;
    // 합이 m이 되었을 때
    if (accumulate === m) {
      cnt += 1; // 카운트 증가
      break;
    }
    end += 1; // 끝점 한 칸 증가
  }
}

console.log(cnt);

풀이

  • 시작점을 고정시킨 후, 끝점을 하나씩 증가시키며 더함 → m을 만날 때 카운트 증가
    • 만약, 누적값이 m을 넘을 경우 시작점을 한 칸 이동시키기

0개의 댓글