[BOJ] 6236. ์šฉ๋ˆ ๊ด€๋ฆฌ (๐Ÿฅˆ, ์ด๋ถ„ ํƒ์ƒ‰)

lemythe423ยท2024๋…„ 2์›” 20์ผ
0

BOJ ๋ฌธ์ œํ’€์ด

๋ชฉ๋ก ๋ณด๊ธฐ
113/133
post-thumbnail

๐Ÿ”—

ํ’€์ด

  1. ํ˜„์šฐ์˜ ํ†ต์žฅ ์ž”์•ก์€ ๊ณ ๋ คํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.
  2. ์ •ํ™•ํžˆ M๋ฒˆ ๋งž์ถ”๊ธฐ ์œ„ํ•ด ์˜๋ฏธ์—†๋Š” ์ž…๊ธˆ๊ณผ ์ถœ๊ธˆ์„ ๋ฐ˜๋ณตํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ธ์ถœ ๊ธˆ์•ก์ด K์ผ ๋•Œ ๋ฐ˜๋“œ์‹œ ์ธ์ถœํ•ด์•ผ ํ•˜๋Š” ํšŸ์ˆ˜๊ฐ€ M์ดํ•˜๋ฉด ๋œ๋‹ค.

K์˜ ์ดˆ๊ธฐ๊ฐ’์ด ๋  ์ˆ˜ ์žˆ๋Š” ๊ฐ’ ์ค‘์— ์ตœ์†Œ๊ฐ’์€ ์ตœ๋Œ€ N์ผ๊ณผ ํ•˜๋ฃจ์— ์“ธ ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ๊ธˆ์•ก(10,000์›)์ด๋‹ค. ๋Œ€๋žต 10์–ต ์ •๋„ ๋˜๋Š”๋ฐ ์ด๋ถ„ ํƒ์ƒ‰์œผ๋กœ ์ฐพ๊ฒŒ ๋˜๋ฉด 2^30 ์ •๋„์ด๊ธฐ ๋•Œ๋ฌธ์— 30๋ฒˆ๋งŒ ํƒ์ƒ‰ํ•˜๋ฉด ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค.

์ตœ๋Œ€์™€ ์ตœ์†Œ์˜ ์ค‘๊ฐ„ ๊ฐ’์ธ ์ธ์ถœ ๊ธˆ์•ก k๋ฅผ ๊ตฌํ•œ ํ›„ ํ•ด๋‹น ์ธ์ถœ ๊ธˆ์•ก์œผ๋กœ N์ผ ๊ฐ„ ์šฉ๋ˆ์„ ์ผ์„ ๋•Œ ์ธ์ถœ ํšŸ์ˆ˜๊ฐ€ M์„ ๋„˜์ง€ ์•Š์œผ๋ฉด ํ˜„์žฌ ์ธ์ถœ ๊ธˆ์•ก์€ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋ฏ€๋กœ ์ตœ์†Œ๊ฐ’์„ ๊ตฌํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ ํƒ์ƒ‰์€ ๋” ์ž‘์€ ์ธ์ถœ ๊ธˆ์•ก ๊ตฌ๊ฐ„์—์„œ ์‹œํ–‰ํ•œ๋‹ค. ์ตœ๋Œ€๊ฐ’์„ ์ธ์ถœ ๊ธˆ์•ก k ๋ณด๋‹ค ์ž‘์€ ๊ฐ’์œผ๋กœ ๋ฐ”๊ฟ”์ฃผ๋ฉด ๋œ๋‹ค.

ํ•˜์ง€๋งŒ ์ธ์ถœ ํšŸ์ˆ˜๊ฐ€ M์„ ๋„˜๊ฒŒ ๋˜๋ฉด ํ˜„์žฌ ์ธ์ถœ ๊ธˆ์•ก k๊ฐ€ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜์ง€ ๋ชปํ•ด์„œ ๋” ์ปค์ ธ์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋ฏ€๋กœ ๋” ํฐ ์ธ์ถœ ๊ธˆ์•ก ๊ตฌ๊ฐ„์—์„œ ํƒ์ƒ‰์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•œ๋‹ค. ์ด๋•Œ๋Š” ์ตœ์†Œ๊ฐ’(low)์„ k+1 ๋กœ ๋ณ€๊ฒฝํ•ด์•ผ ํ•œ๋‹ค.

ํƒ์ƒ‰์„ ์ˆ˜ํ–‰ํ•˜๋Š” ํ•จ์ˆ˜ run() ์—์„œ๋Š” ํ˜„์žฌ ์ธ์ถœ ๊ธˆ์•ก k๊ฐ€ ๋‹น์ผ ์šฉ๋ˆ cash ๋ณด๋‹ค ์ž‘์€ ๊ฒฝ์šฐ๋Š” ํ•ญ์ƒ false ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ธ์ถœ ๊ธˆ์•ก์ด ์šฉ๋ˆ ๋ณด๋‹ค ์ž‘์€ ๊ฒฝ์šฐ๋Š” ์•„๋ฌด๋ฆฌ ์ธ์ถœ์„ ๋ฐ˜๋ณตํ•ด๋„ ์†Œ์šฉ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

import java.util.*;
import java.io.*;

public class Main {
    static final long MAX_N = 100_000;
    static final long MAX_DAY_CASH = 10_000;

    static int N;
    static int M;
    static long[] passbook;

    static boolean run(long K) {
        int count = 1;
        long leftMoney = K;
        for (long cash : passbook) {

            if (cash > K) {
                return false;
            }

            if (cash <= leftMoney) {
                leftMoney -= cash;
            } else {
                leftMoney = K - cash;
                count++;
            }
        }
        return count <= M;
    }

    public static void main(String[] args) throws IOException {
        Scanner sc = new Scanner(System.in);
        N = sc.nextInt();
        M = sc.nextInt();

        passbook = new long[N];
        for (int i = 0; i < N; i++) {
            passbook[i] = sc.nextLong();
        }

        long low = 0;
        long high = MAX_N * MAX_DAY_CASH;
        while (low <= high) {
            long k = (low + high) / 2;
            
            boolean result = run(k);
            if (result) {
                high = k - 1;
            } else {
                low = k + 1;
            }
        }

        System.out.println(low);
    }
}
profile
์•„๋ฌด๋ง์ด๋‚˜ํ•˜๊ธฐ

0๊ฐœ์˜ ๋Œ“๊ธ€