728x90
소스코드
let fs = require('fs');
const filePath = process.platform === `linux` ? `/dev/stdin` : `예제.txt`;
let input = fs.readFileSync(filePath).toString().split('\n');
const c = console.log
let inputs = input[0].split(' ').map(Number)
n = inputs[0]
m = inputs[1]
let lst = input[1].split(' ').map(Number)
let prefix_sum = [0]
let temp = 0
for(let i = 0 ; i < n ; i++){
temp += lst[i]
prefix_sum.push(temp)
temp = prefix_sum[i+1]
}
let maxNum = -10000001
for(let i = m ; i < n+1 ; i++){
maxNum = Math.max(maxNum , prefix_sum[i] - prefix_sum[i-m])
}
c(maxNum)
풀이
누적합을 이용하는 문제이다.
누적합을 구하고 난 후 m일 연속 합이 제일 큰 숫자를 구해야 하는데 이를 구하기 위해선 2일, 3일 , ... , 5일 등등 연속해서 구하는 법을 알아야한다.
m=5 라고 가정했을때 ,
prefix_sum[i] - prefix_sum[i-m] 이라는 공식을 구할 수 있었다.
예시)
더보기
(3 -2 -4 -6 + 0 +3 +7 +13 + 8) - (3 -2 -4 -6 -0)
문제
https://www.acmicpc.net/problem/2559
2559번: 수열
첫째 줄에는 두 개의 정수 N과 K가 한 개의 공백을 사이에 두고 순서대로 주어진다. 첫 번째 정수 N은 온도를 측정한 전체 날짜의 수이다. N은 2 이상 100,000 이하이다. 두 번째 정수 K는 합을 구하기
www.acmicpc.net
728x90
'BOJ > 누적합' 카테고리의 다른 글
BOJ : 11659 구간합구하기 (JS) (0) | 2023.01.11 |
---|