코딩테스트

[백준] 수열 (JS)

여유로운 프론트엔드 개발자 2025. 5. 2. 16:52

문제

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

매일 아침 9시에 학교에서 측정한 온도가 어떤 정수의 수열로 주어졌을 때, 연속적인 며칠 동안의 온도의 합이 가장 큰 값을 알아보고자 한다. 예를 들어, 아래와 같이 10일 간의 온도가 주어졌을 때, 3 -2 -4 -9 0 3 7 13 8 -3 모든 연속적인 이틀간의 온도의 합이 가장 큰 값은 21이다. 매일 측정한 온도가 정수의 수열로 주어졌을 때, 연속적인 며칠 동안의 온도의 합이 가장 큰 값을 계산하는 프로그램을 작성하시오.

입력

첫째 줄에는 두 개의 정수 N과 K가 한 개의 공백을 사이에 두고 순서대로 주어진다. 첫 번째 정수 N은 온도를 측정한 전체 날짜의 수이다. N은 2 이상 100,000 이하이다. 두 번째 정수 K는 합을 구하기 위한 연속적인 날짜의 수이다. K는 1과 N 사이의 정수이다. 둘째 줄에는 매일 측정한 온도를 나타내는 N개의 정수가 빈칸을 사이에 두고 주어진다. 이 수들은 모두 -100 이상 100 이하이다.

출력

첫째 줄에는 입력되는 온도의 수열에서 연속적인 K일의 온도의 합이 최대가 되는 값을 출력한다.

풀이

1. 1일부터 K일까지의 온도 합을 초기 윈도우 합으로 설정한다.

2. 윈도우를 한 칸씩 오른쪽으로 이동시키며, 왼쪽 끝의 값을 빼고 오른쪽 끝의 값을 더해 현재 구간의 온도 합을 계산한다. 그 값을 기존 최대값과 비교하여 갱신한다.

3. 모든 구간을 확인한 후, 최종적으로 가장 큰 온도 합을 담고 있는 maxTemperatureSum을 출력한다.

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

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

let windowSum = 0;
for (let i = 0; i < count; i++) {
    windowSum += arr[i];
}

let maxTemperatureSum = windowSum;

for (let i = count; i < arr.length; i++) {
    windowSum = windowSum - arr[i - count] + arr[i];
    maxTemperatureSum = Math.max(maxTemperatureSum, windowSum);
}

console.log(maxTemperatureSum);

 

'코딩테스트' 카테고리의 다른 글

[백준] 문자열 교환 (JS)  (0) 2025.05.12
[백준] 우당탕탕 영화예매 (JS)  (0) 2025.05.09
[백준] 귀여운 라이언 (JS)  (0) 2025.05.01
[백준] 소가 길을 건너간 이유 5 (JS)  (0) 2025.04.29
[백준] blobyum (JS)  (0) 2025.04.28