문제 출저
https://www.acmicpc.net/problem/12847
12847번: 꿀 아르바이트
월세를 내기 바로 전 날 까지 인 n (1 ≤ n ≤ 100,000) 일과 일을 할 수 있는 날 m (0 ≤ m ≤ n) 일이 주어진다. 그 다음 줄 에는 1일부터 n일 까지 일급 Ti가 순서대로 주어진다. (0 < Ti ≤ 1,000,000)
www.acmicpc.net
문제 풀이
전체 기간 n과 일을 할 수 있는 기간 m이 주어집니다. 이 때, 최대한 많은 돈을 버는 경우를 구해야 합니다.
누적합으로 풀었습니다.
1차원 배열 long[] prefix를 만들고 탐색을 통해 최대의 돈을 구했습니다.
범위가 크기 때문에 int가 아닌 long 자료형을 사용했습니다.
소스 코드
package baekjoon.backjoon10.day2131.day29;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
/*
꿀 아르바이트
https://www.acmicpc.net/problem/12847
*/
public class B12847 {
static int n;
static int m;
static long[] board;
static long[] prefix;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken());
m = Integer.parseInt(st.nextToken());
board = new long[n];
st = new StringTokenizer(br.readLine());
for(int i = 0; i < n; i++) {
board[i] = Integer.parseInt(st.nextToken());
}
prefix = new long[n+1];
for(int i = 1; i < n+1; i++) {
prefix[i] = board[i-1] + prefix[i-1];
}
long answer = 0;
for(int i = 0; i < n+1-m; i++) {
answer = Math.max(answer, prefix[i+m] - prefix[i]);
}
System.out.println(answer);
}
}