백준 12847 - 꿀 아르바이트

김예림·2025년 5월 6일

문제 파악

월세를 내야 하는 날은 n+1일, 최대 연속으로 일할 수 있는 날은 m일
날 마다 받는 일급이 달라 가장 많은 돈을 벌 수 있는 날들을 찾는 문제

슬라이딩 윈도우로 길이 m의 연속 부분합 중 최댓값을 구하는 문제!

풀이

  1. 버퍼리더와 스트링토크나이저를 사용해 전체 날짜 수 n과 최대 일할 수 있는 날짜 수 m을 입력받는다.
  2. n개의 일급을 입력받아 배열에 집어 넣는다.
  3. 초기 윈도우의 합을 계산해 max로 초기 설정을 해놓는다.
  4. 슬라이딩 윈도우를 수행하며 최댓값을 갱신한다.

코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class 꿀_아르바이트 {

    public static void main(String[] args) throws IOException{
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(bf.readLine());

        //전체 날짜 수
        int n = Integer.parseInt(st.nextToken());
        //최대 일할 수 있는 날짜 수
        int m = Integer.parseInt(st.nextToken());

        //일급 입력받아 배열에 넣기
        StringTokenizer st2 = new StringTokenizer(bf.readLine());
        //int로 했을 때 틀렸다고 나와 long으로 변경(사이즈가 클 수 있음)
        long[] salary = new long[n];
        for (int i=0; i<n; i++) {
            salary[i] = Long.parseLong(st2.nextToken());
        }

        //초기 윈도우 합을 max로 설정정
        long sum = 0;
        for (int i=0; i<m; i++) {
            sum += salary[i];
        }
        long max = sum;

        //슬라이딩 윈도우 수행
        for (int i=m; i<n; i++) {
            //윈도우 오른쪽으로 이동
            sum = sum - salary[i-m] + salary[i];
            //최댓값 갱신
            max = Math.max(max, sum);
        }

        System.out.println(max);
    }
}

0개의 댓글