๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์•Œ๊ณ ๋ฆฌ์ฆ˜

[Java] BOJ 2805 ๋‚˜๋ฌด ์ž๋ฅด๊ธฐ

by ๐ŸŠ๊ทค๐ŸŠ 2024. 8. 12.

๋ฌธ์ œ 

๋ฌธ์ œ ๋งํฌ https://www.acmicpc.net/problem/2805

  • ์ƒ๊ทผ์ด๋Š” ๋‚˜๋ฌด M๋ฏธํ„ฐ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.
  • ์ƒ๊ทผ์ด๋Š” ์ƒˆ๋กœ ๊ตฌ์ž…ํ•œ ๋ชฉ์žฌ์ ˆ๋‹จ๊ธฐ๋ฅผ ์ด์šฉํ•ด์„œ ๋‚˜๋ฌด๋ฅผ ๊ตฌํ• ๊ฒƒ์ด๋‹ค.
  • ์ƒ๊ทผ์ด๋Š” ํ™˜๊ฒฝ์— ๋งค์šฐ ๊ด€์‹ฌ์ด ๋งŽ๊ธฐ ๋•Œ๋ฌธ์—, ๋‚˜๋ฌด๋ฅผ ํ•„์š”ํ•œ ๋งŒํผ๋งŒ ์ง‘์œผ๋กœ ๊ฐ€์ ธ๊ฐ€๋ ค๊ณ  ํ•œ๋‹ค.
  • ์ด๋•Œ, ์ ์–ด๋„ M๋ฏธํ„ฐ์˜ ๋‚˜๋ฌด๋ฅผ ์ง‘์— ๊ฐ€์ ธ๊ฐ€๊ธฐ ์œ„ํ•ด์„œ ์ ˆ๋‹จ๊ธฐ์— ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๋†’์ด์˜ ์ตœ๋Œ“๊ฐ’์„ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.
  • ๋ชฉ์žฌ์ ˆ๋‹จ๊ธฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋™์ž‘ํ•œ๋‹ค. ๋จผ์ €, ์ƒ๊ทผ์ด๋Š” ์ ˆ๋‹จ๊ธฐ์— ๋†’์ด H๋ฅผ ์ง€์ •ํ•ด์•ผ ํ•œ๋‹ค.
  • ๋†’์ด๋ฅผ ์ง€์ •ํ•˜๋ฉด ํ†ฑ๋‚ ์ด ๋•…์œผ๋กœ๋ถ€ํ„ฐ H๋ฏธํ„ฐ ์œ„๋กœ ์˜ฌ๋ผ๊ฐ„๋‹ค.
  • ๊ทธ ๋‹ค์Œ, ํ•œ ์ค„์— ์—ฐ์†ํ•ด์žˆ๋Š” ๋‚˜๋ฌด๋ฅผ ๋ชจ๋‘ ์ ˆ๋‹จํ•ด๋ฒ„๋ฆฐ๋‹ค.
  • ๋”ฐ๋ผ์„œ, ๋†’์ด๊ฐ€ H๋ณด๋‹ค ํฐ ๋‚˜๋ฌด๋Š” H ์œ„์˜ ๋ถ€๋ถ„์ด ์ž˜๋ฆด ๊ฒƒ์ด๊ณ , ๋‚ฎ์€ ๋‚˜๋ฌด๋Š” ์ž˜๋ฆฌ์ง€ ์•Š์„ ๊ฒƒ์ด๋‹ค.
    • ์˜ˆ๋ฅผ ๋“ค์–ด, ํ•œ ์ค„์— ์—ฐ์†ํ•ด์žˆ๋Š” ๋‚˜๋ฌด์˜ ๋†’์ด๊ฐ€ 20, 15, 10, 17์ด๋ผ๊ณ  ํ•˜์ž.
    • ์ƒ๊ทผ์ด๊ฐ€ ๋†’์ด๋ฅผ 15๋กœ ์ง€์ •ํ–ˆ๋‹ค๋ฉด, ๋‚˜๋ฌด๋ฅผ ์ž๋ฅธ ๋’ค์˜ ๋†’์ด๋Š” 15, 15, 10, 15๊ฐ€ ๋  ๊ฒƒ์ด๊ณ , ์ƒ๊ทผ์ด๋Š” ๊ธธ์ด๊ฐ€ 5์ธ ๋‚˜๋ฌด์™€ 2์ธ ๋‚˜๋ฌด๋ฅผ ๋“ค๊ณ  ์ง‘์— ๊ฐˆ ๊ฒƒ์ด๋‹ค. (์ด 7๋ฏธํ„ฐ๋ฅผ ์ง‘์— ๋“ค๊ณ  ๊ฐ„๋‹ค)
    • ์ ˆ๋‹จ๊ธฐ์— ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๋†’์ด๋Š” ์–‘์˜ ์ •์ˆ˜ ๋˜๋Š” 0์ด๋‹ค.
  • ์ฒซ์งธ ์ค„์— ๋‚˜๋ฌด์˜ ์ˆ˜ N๊ณผ ์ƒ๊ทผ์ด๊ฐ€ ์ง‘์œผ๋กœ ๊ฐ€์ ธ๊ฐ€๋ ค๊ณ  ํ•˜๋Š” ๋‚˜๋ฌด์˜ ๊ธธ์ด M์ด ์ฃผ์–ด์ง„๋‹ค. (1 ≤ N ≤ 1,000,000, 1 ≤ M ≤ 2,000,000,000)
  • ๋‘˜์งธ ์ค„์—๋Š” ๋‚˜๋ฌด์˜ ๋†’์ด๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๋‚˜๋ฌด์˜ ๋†’์ด์˜ ํ•ฉ์€ ํ•ญ์ƒ M๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™๊ธฐ ๋•Œ๋ฌธ์—, ์ƒ๊ทผ์ด๋Š” ์ง‘์— ํ•„์š”ํ•œ ๋‚˜๋ฌด๋ฅผ ํ•ญ์ƒ ๊ฐ€์ ธ๊ฐˆ ์ˆ˜ ์žˆ๋‹ค.
  • ๋†’์ด๋Š” 1,000,000,000๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์–‘์˜ ์ •์ˆ˜ ๋˜๋Š” 0์ด๋‹ค.
  • ์ ์–ด๋„ M๋ฏธํ„ฐ์˜ ๋‚˜๋ฌด๋ฅผ ์ง‘์— ๊ฐ€์ ธ๊ฐ€๊ธฐ ์œ„ํ•ด์„œ ์ ˆ๋‹จ๊ธฐ์— ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๋†’์ด์˜ ์ตœ๋Œ“๊ฐ’์„ ์ถœ๋ ฅํ•œ๋‹ค.

์•„์ด๋””์–ด

  • ์ด๋ถ„ํƒ์ƒ‰์„ ์ด์šฉํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ’€์–ด์•ผ๊ฒ ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค.
  • ๋”ฐ๋ผ์„œ ์ž…๋ ฅ๋ฐ›์œผ๋ฉด์„œ ๋‚˜๋ฌด ๊ธธ์ด์ค‘ ์ตœ๋Œ€๊ฐ’์„ ์ฐพ์•„์„œ ์ตœ์†Ÿ๊ฐ’ 0์„ ์‹œ์ž‘์ ์œผ๋กœ, ์ตœ๋Œ“๊ฐ’์„ ๋์ ์œผ๋กœ ์žก์•„์„œ ์ด๋ถ„ํƒ์ƒ‰์„ ๋Œ๋ ธ๋‹ค.

๊ฒช์€ ์‹œํ–‰์ฐฉ์˜ค

  • X

์ด๋ถ„ ํƒ์ƒ‰์„ ํ•œ๋ฒˆ ๊ณต๋ถ€ํ•ด๋†“์œผ๋‹ˆ ์‰ฝ๊ฒŒ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์–ด์„œ ์ข‹๋‹ค..!!

์ฝ”๋“œ

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

public class BOJ2805 {

    static int N;
    static int M;
    static int max;
    static int trees[];
    static long result;

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

        // ๋‚˜๋ฌด์˜ ์ˆ˜
        N = Integer.parseInt(st.nextToken());
        // ํ•„์š”ํ•œ ๋‚˜๋ฌด์˜ ๊ธธ์ด
        M = Integer.parseInt(st.nextToken());

        // ์ตœ๋Œ“๊ฐ’
        max = Integer.MIN_VALUE;

        trees = new int[N];

        // ๋†’์ด ์ตœ๋Œ“๊ฐ’ ๊ฒฐ๊ณผ
        result = 0;

        StringTokenizer st2  = new StringTokenizer(br.readLine());

        for(int i = 0; i < N; i++){
            int n = Integer.parseInt(st2.nextToken());

            // ์ตœ๋Œ“๊ฐ’ ๊ฐฑ์‹ 
            if(n > max){
                max = n;
            }

            // ๋‚˜๋ฌด ๊ธธ์ด ๋ฐฐ์—ด์— ์ €์žฅ
            trees[i] = n;
        }

        DFS(0, max);

        System.out.println(result);
    }

    public static void DFS(long s, long f){
        // ์‹œ์ž‘ ๊ธธ์ด๊ฐ€ ๋ ๊ธธ์ด๋ณด๋‹ค ๊ธธ์–ด์ง€๋ฉด ์ข…๋ฃŒ
        if(s > f){
            return;
        }

        // ๋‚˜๋ฌด ๊ฐœ์ˆ˜ ์นด์šดํŠธ ๋ณ€์ˆ˜
        long cnt = 0;

        // ์ž๋ฅผ ๋‚˜๋ฌด ๊ธธ์ด
        // ๊ธธ์ด๋ฅผ ์‹œ์ž‘์ ๊ณผ ๋์ ์˜ ์ค‘๊ฐ„์ง€์ ์œผ๋กœ ์„ค์ •
        long len = (f + s)/2;

        for(int i = 0; i < N; i++){
            // ๋‚˜๋ฌด๋ฅผ ์ž๋ฅด๊ณ  ๋‚จ์€ ๊ธธ์ด๋ฅผ ์ €์žฅํ•  ๋ณ€์ˆ˜
            long minus = 0;

            // ๋ฐฐ์—ด์— ์ €์žฅ๋˜์–ด์žˆ๋Š” ๋‚˜๋ฌด๊ธธ์ด์— ์ž๋ฅผ ๋‚˜๋ฌด๊ธธ์ด๋ฅผ ๋นผ์คŒ
            minus = trees[i] - len;

            // ๋งŒ์•ฝ ๋บ€ ๊ธธ์ด๊ฐ€ ์Œ์ˆ˜๋ผ๋ฉด ํ•ด๋‹น ๋‚˜๋ฌด๋Š” ํ•ด๋‹น ๊ธธ์ด๋กœ ์ž๋ฅผ ์ˆ˜ ์—†๋‹ค๋Š”
            // ๋œป์ด๋ฏ€๋กœ 0์œผ๋กœ ๋‹ค์‹œ ์ €์žฅ
            if(minus < 0){
                minus = 0;
            }

            // ์ „์ฒด ๋‚จ์€ ๋‚˜๋ฌด ๊ธธ์ด์— ํ•ด๋‹น ๋‚จ์€ ๋‚˜๋ฌด ๊ธธ์ด๋ฅผ ์ €์žฅ
            cnt = cnt + minus;
        }

        // ๋งŒ์•ฝ ๋‚จ์€ ๋‚˜๋ฌด ๊ธธ์ด๊ฐ€ ํ•„์š”ํ•œ ๋‚˜๋ฌด ๊ธธ์ด๋ณด๋‹ค ๊ฐ™๊ฑฐ๋‚˜ ํฌ๋‹ค๋ฉด
        // ์ž๋ฅด๋Š” ๋‚˜๋ฌด ๊ธธ์ด๋ฅผ ๋” ๊ธธ๊ฒŒ ํ•ด๋„ ๋œ๋‹ค๋Š” ๋œป์ด๋ฏ€๋กœ
        if(cnt >= M){
            // ๊ฒฐ๊ณผ๊ฐ’์„ ํ˜„์žฌ ๋‚˜๋ฌด ๊ธธ์ด๋กœ ์ €์žฅํ•ด์ฃผ๊ณ 
            result = len;
            // ์‹œ์ž‘ ์ง€์ ์„ ์ค‘๊ฐ„ ๊ธธ์ด + 1๋กœ ์„ค์ •
            DFS(len + 1, f);
        }
        // ๋งŒ์•ฝ ๋‚จ์€ ๋‚˜๋ฌด ๊ธธ์ด๊ฐ€ ํ•„์š”ํ•œ ๋‚˜๋ฌด ๊ธธ์ด๋ณด๋‹ค ์ž‘์œผ๋ฉด
        // ์ž๋ฅด๋Š” ๋‚˜๋ฌด ๊ธธ์ด๊ฐ€ ๋” ์งง์•„์•ผ๋˜๋ฏ€๋กœ
        else if(cnt < M){
            // ๋ ์ง€์ ์„ ์ค‘๊ฐ„ ๊ธธ์ด - 1๋กœ ์„ค์ •
            DFS(s, len - 1);
        }
    }
}