개발 블로그
article thumbnail

 

아이디어

임의의 K 원에 대해서 최소 인출 횟수가 M 보다 크면 K 가 너무 작다는 뜻이고 M 보다 작으면 K 가 너무 크다는 뜻이다.

 

따라서 K 원에 대해서 최소 인출 횟수를 계산해서 M 보다 크면 K 를 늘려가고 M 보다 작으면 K 를 줄여가는 방법을 사용하면 된다.

 

그리고 문제에서는 최소 금액 K 를 요구하고 있으므로 K == M 을 만족하는 케이스에서도 K 를 줄여가는 방식을 통해 K == M 을 만족하는 최소 K 를 구하면 된다.

 

추가로 현우가 주머니에 소지할 수 있는 금액의 최대값이 K 이므로 K 는 i번째 날에 이용할 금액들 중 최대값 이상이어야 한다. 그리고 인출 횟수인 M 의 최소값이 1이므로 K 가 가질 수 있는 최대값은 이용할 금액들의 합이되어 아래와 같은 범위를 가진다.

 

max(이용 금액)  ≤  K  ≤  sum(이용 금액)

 

 

 

풀이코드

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

public class Main {
    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 M = Integer.parseInt(st.nextToken());

        int[] money = new int[N];
        int start = 1;
        int end = 0;
        for (int i = 0; i < N; i++) {
            money[i] = Integer.parseInt(br.readLine());
            start = Math.max(start, money[i]);
            end += money[i];
        }

        while (start <= end) {
            int K = (start + end) / 2;

            int balance = 0;
            int cnt = 0;

            for (int i = 0; i < N; i++) {
                if (balance < money[i]) {
                    cnt++;
                    balance = K;
                }
                balance -= money[i];
            }

            if (cnt <= M) {
                end = K - 1;
            } else {
                start = K + 1;
            }
        }

        System.out.println(end + 1);
    }
}

'Algorithm > 백준 알고리즘' 카테고리의 다른 글

9663번. N-Queen  (1) 2023.10.29
1699번. 제곱수의 합  (0) 2023.10.29
14247번. 나무 자르기  (0) 2023.10.29
1932번. 정수 삼각형  (1) 2023.10.27
1012번. 유기농 배추  (0) 2023.10.27
profile

개발 블로그

@하얀.손

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!