배열 s와 숫자 d,m을 입력 받는다. s의 연속된 요소를 추출해 요소의 합이 d이고 길이가 m인 배열을 몇개나 만들 수 있는가?
이 문제는 조건에 맞는 부분 배열을 추출하는 문제이다.
연속된 이라는 말이 핵심으로, 이를 키 포인트로 생각하고 문제를 풀었다.
일단 순회하며 추출한 요소의 합을 구하려고 할 때, 순회하는 인덱스의 범위는 0부터 s.length-m 으로 잡았다. 어차피 길이가 m만큼인 부분 배열을 추출할 것이기 때문에 이를 초과하는 범위까지 잡을 필요는 없다.
그리고 순회하는 인덱스마다 for문을 한번 더 돌려서 m개 만큼의 요소를 더했다. 이는 부분 배열의 합을 뜻하니까.
그리고 합이 d와 같은 경우 카운팅 하고 카운팅한 갯수를 리턴했다.
'use strict';
const fs = require('fs');
process.stdin.resume();
process.stdin.setEncoding('utf-8');
let inputString = '';
let currentLine = 0;
process.stdin.on('data', function(inputStdin) {
inputString += inputStdin;
});
process.stdin.on('end', function() {
inputString = inputString.split('\n');
main();
});
function readLine() {
return inputString[currentLine++];
}
/*
* Complete the 'birthday' function below.
*
* The function is expected to return an INTEGER.
* The function accepts following parameters:
* 1. INTEGER_ARRAY s
* 2. INTEGER d
* 3. INTEGER m
*/
function birthday(s, d, m) {
let count = 0;
for(let i = 0; i <= s.length - m; i++) {
let sum = 0;
for(let j = 0; j < m; j++) {
sum += s[i+j];
}
if(sum === d) {
count++;
}
}
return count;
}
function main() {
const ws = fs.createWriteStream(process.env.OUTPUT_PATH);
const n = parseInt(readLine().trim(), 10);
const s = readLine().replace(/\s+$/g, '').split(' ').map(sTemp => parseInt(sTemp, 10));
const firstMultipleInput = readLine().replace(/\s+$/g, '').split(' ');
const d = parseInt(firstMultipleInput[0], 10);
const m = parseInt(firstMultipleInput[1], 10);
const result = birthday(s, d, m);
ws.write(result + '\n');
ws.end();
}