Algorithm/백준 문제풀이

[백준] 12847 꿀 아르바이트 - Java

너지살 2023. 10. 29. 18:44

 

 

 

문제 출저

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);


  }

}