
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์ ๋์ง ์๋ ์์ฐ์์ด๋ค.
์ฒซ์งธ ์ค์ ๊ฒฝ์ฐ์ ์๋ฅผ ์ถ๋ ฅํ๋ค.
4 2
1 1 1 1
3
10 5
1 2 3 4 2 5 3 1 1 2
3
โ ๊ตฌ๊ฐ์ ๋ถ๋ถํฉ์ ์ด์ฉํ๋ ๋ฌธ์
ํฌ ํฌ์ธํฐ๋ 1์ฐจ์ ๋ฐฐ์ด์์ ๋ ๊ฐ์ ํฌ์ธํฐ๋ฅผ ์กฐ์ํ์ฌ ์ํ๋ ๊ฒฐ๊ณผ๋ฅผ ์ป๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
์กฐ๊ฑด์ ๋ฐฐ์ด์ ์์๊ฐ ์์ฐ์์ฌ์ผ ํ๋ค๋ ๊ฒ์ด๋ค.
start, end๋ผ๋ ๋ ๊ฐ์ ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํด์ ๊ตฌํด์ผํ๋ ๊ฐ๋ณด๋ค ๋ฐฐ์ด์ ๋ถ๋ถํฉ์ด ์์ผ๋ฉด mid๋ฅผ ํ๊ฐ ์ด๋ํ์ฌ ๋ฐฐ์ด์ ํฌ๊ธฐ๋ฅผ ๋๋ฆฌ๊ณ ๋ฐ๋๋ก ๋ถ๋ถํฉ์ด ํฌ๋ฉด mid๋ฅผ ํ๊ฐ ๋ค๋ก ์ด๋ํ์ฌ ๋ฐฐ์ด์ ํฌ๊ธฐ๋ฅผ ์ค์ธ๋ค.
const readline = require("readline");
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
const numberSum = (limitArr, numArr) => {
const sumArr = [10001];
let sum = 0;
let count = 0;
let mid = 0;
const numberArr = Number(limitArr[0]);
const cutlineNum = Number(limitArr[1]);
for (let i = 0; i < numberArr; i++) {
sum += Number(numArr[i]);
sumArr[i] = sum;
}
// unshift๋ฅผ ํตํด [0,1,2,3,4...] ๋ฐฐ์ด๋ก ๋ง๋ ๋ค
sumArr.unshift(0);
for (let i = 0; i <= numberArr; i++) {
// start์ ํฌ์ธํฐ ํ๊ฐ, end์ ํฌ์ธํฐ ํ๊ฐ ๋ง๋ ๋ค.
start = i;
end = numberArr;
// ์ค๊ฐ์ง์ mid๋ณด๋ค cutlineNum์ด ์๋ค๋ฉด start๋ฅผ ํ์นธ ์์ผ๋ก,
// cutlineNum์ด ํฌ๋ค๋ฉด end๋ฅผ ํ์นธ ๋ค๋ก
while (start <= end) {
mid = parseInt((start + end) / 2);
if (cutlineNum > sumArr[mid] - sumArr[i]) {
start = mid + 1;
} else if (cutlineNum < sumArr[mid] - sumArr[i]) {
end = mid - 1;
} else {
count++;
break;
}
}
}
console.log(count);
};
const inputArr = [];
rl.on("line", (userInput) => {
inputArr.push(userInput);
}).on("close", () => {
const limitArr = inputArr[0].split(" ");
const numArr = inputArr[1].split(" ");
numberSum(limitArr, numArr);
});