자료구조&알고리즘/백준
2559번: 수열 [JAVA]
yong_ღ'ᴗ'ღ
2023. 10. 27. 11:44
https://www.acmicpc.net/problem/2559
2559번: 수열
첫째 줄에는 두 개의 정수 N과 K가 한 개의 공백을 사이에 두고 순서대로 주어진다. 첫 번째 정수 N은 온도를 측정한 전체 날짜의 수이다. N은 2 이상 100,000 이하이다. 두 번째 정수 K는 합을 구하기
www.acmicpc.net
접근 방식) 누적합
1. 입력받은 온도 수열을 누적합 배열로 저장한다.
누적합 배열은 prefixSum[i] = prefixSum[i - 1] + 현재입력값
으로 저장하기 위해서 int[] prefixSum = new int[N + 1]; 로 생성한다.
2. K부터 누적합배열 끝까지 돌면서, K일의 온도 합이 max값보다 크면 max를 업데이트해준다.
ex) index 2 ~ 5 까지의 누적합은?
→ prefixSum[5] - prefixSum[2 - 1]
3. 결과값 : max값 출력
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class B_2559 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken()); // 전체 날짜 수
int K = Integer.parseInt(st.nextToken()); // 연속 날짜 수
int[] prefixSum = new int[N + 1]; // 누적합 배열
st = new StringTokenizer(br.readLine());
for (int i = 1; i <= N; i++) {
prefixSum[i] = prefixSum[i - 1] + Integer.parseInt(st.nextToken());
}
// 배열 전체 돌면서, K개씩 누적합 계산하며, max값 업데이트
int max = Integer.MIN_VALUE;
for (int i = K; i <= N; i++) {
max = Math.max(max, prefixSum[i] - prefixSum[i - K]);
}
System.out.println(max);
}
}