๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Algorithm

[Algorithm/Java][๋ฐฑ์ค€] 2805๋ฒˆ ๋‚˜๋ฌด ์ž๋ฅด๊ธฐ

๋ฐ˜์‘ํ˜•

[๋ฐฑ์ค€] 2805๋ฒˆ ๋‚˜๋ฌด ์ž๋ฅด๊ธฐ

https://www.acmicpc.net/problem/2805

๋ฌธ์ œ์ ‘๊ทผ

์ฒ˜์Œ์—๋Š” ๊ฐ์ด ์•ˆ์žกํ˜€์„œ ๋ฐ‘์— ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ถ„๋ฅ˜๊ฐ€ ์ด๋ถ„ ํƒ์ƒ‰์ด๋ผ๊ณ  ์จ์ ธ์žˆ์–ด์„œ, ์˜›๋‚ ์— ๋ฐฐ์šด ๊ธฐ์–ต์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ–ˆ๋‹ค.
left, right, mid๋ฅผ ์ด์šฉํ•ด์„œ ๊ฐ’์„ ์ฐพ์•˜๋‹ค.
๋งŒ์•ฝ ๋”ฑ ๋–จ์–ด์ง€๋Š” ๊ฐ’์ด ์—†์„ ๊ฒฝ์šฐ, ์ ์–ด๋„ m์„ ๋„˜๊ฒจ์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— right๊ฐ’์„ returnํ•˜๋„๋ก ํ–ˆ๋‹ค.

Code

import java.util.Arrays;
import java.util.Scanner;

public class BOJ2805 {

    static int cutHeight(int[] trees, int m){
        Arrays.sort(trees);
        int left = 0;
        int right = trees[trees.length-1];
        while(left <= right){
            long sum =0;
            int mid = (left + right) / 2;
            for(int tree : trees){
                if(tree-mid > 0) sum += tree-mid;
            }
            if(sum > m) left = mid +1;
            else if(sum < m) right = mid-1;
            else{
                return mid;
            }
        }
        return right;
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int m = sc.nextInt();
        int[] trees = new int[n];
        for (int i = 0; i <n ; i++) {
            trees[i] = sc.nextInt();
        }
        System.out.println(cutHeight(trees,m));
    }
}

์–ด๋ ค์› ๋˜ ์  / ๋ฐฐ์šด ์  / ๋Š๋‚€ ์ 

์ผ๋‹จ ์ด๋ถ„ ํƒ์ƒ‰์ด ์ •ํ™•ํžˆ๋Š” ๊ธฐ์–ต์ด ๋‚˜์ง€๊ฐ€ ์•Š์•˜๊ณ  ์ด๋Ÿฐ ๋Š๋‚Œ์ด์˜€์ง€ ํ•˜๊ณ  ํ’€์–ด์„œ ์ฒ˜์Œ์—๋Š” left = mid +1, right = mid-1 ์„ ๊ทธ๋ƒฅ mid๊ฐ’๋งŒ ๋Œ€์ž…ํ•ด์„œ ๋ฌดํ•œ๋ฃจํ”„๊ฐ€ ๋Œ์•˜๋‹ค. ๊ธฐ๋ณธ์ ์ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ํ•œ ๋ฒˆ ์ •๋ฆฌํ•˜๋ฉด์„œ ๊ณต๋ถ€ํ•  ํ•„์š”์„ฑ์„ ๋Š๊ผˆ๋‹ค.

๋ฐ˜์‘ํ˜•