๐Ÿ“– [๋ฐฑ์ค€์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ’€์ด] Q.2805 ๋‚˜๋ฌด ์ž๋ฅด๊ธฐ ๋ฌธ์ œ ํ’€์ด - java

๐Ÿ“– ๋ฌธ์ œ

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

์ƒ๊ทผ์ด๋Š” ๋‚˜๋ฌด M๋ฏธํ„ฐ๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ๊ทผ์ฒ˜์— ๋‚˜๋ฌด๋ฅผ ๊ตฌ์ž…ํ•  ๊ณณ์ด ๋ชจ๋‘ ๋งํ•ด๋ฒ„๋ ธ๊ธฐ ๋•Œ๋ฌธ์—, ์ •๋ถ€์— ๋ฒŒ๋ชฉ ํ—ˆ๊ฐ€๋ฅผ ์š”์ฒญํ–ˆ๋‹ค.

์ •๋ถ€๋Š” ์ƒ๊ทผ์ด๋„ค ์ง‘ ๊ทผ์ฒ˜์˜ ๋‚˜๋ฌด ํ•œ ์ค„์— ๋Œ€ํ•œ ๋ฒŒ๋ชฉ ํ—ˆ๊ฐ€๋ฅผ ๋‚ด์ฃผ์—ˆ๊ณ , ์ƒ๊ทผ์ด๋Š” ์ƒˆ๋กœ ๊ตฌ์ž…ํ•œ ๋ชฉ์žฌ์ ˆ๋‹จ๊ธฐ๋ฅผ ์ด์šฉํ•ด์„œ ๋‚˜๋ฌด๋ฅผ ๊ตฌํ• ๊ฒƒ์ด๋‹ค.

๋ชฉ์žฌ์ ˆ๋‹จ๊ธฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋™์ž‘ํ•œ๋‹ค. ๋จผ์ €, ์ƒ๊ทผ์ด๋Š” ์ ˆ๋‹จ๊ธฐ์— ๋†’์ด H๋ฅผ ์ง€์ •ํ•ด์•ผ ํ•œ๋‹ค. ๋†’์ด๋ฅผ ์ง€์ •ํ•˜๋ฉด ํ†ฑ๋‚ ์ด ๋•…์œผ๋กœ๋ถ€ํ„ฐ H๋ฏธํ„ฐ ์œ„๋กœ ์˜ฌ๋ผ๊ฐ„๋‹ค.

๊ทธ ๋‹ค์Œ, ํ•œ ์ค„์— ์—ฐ์†ํ•ด์žˆ๋Š” ๋‚˜๋ฌด๋ฅผ ๋ชจ๋‘ ์ ˆ๋‹จํ•ด๋ฒ„๋ฆฐ๋‹ค. ๋”ฐ๋ผ์„œ, ๋†’์ด๊ฐ€ H๋ณด๋‹ค ํฐ ๋‚˜๋ฌด๋Š” H ์œ„์˜ ๋ถ€๋ถ„์ด ์ž˜๋ฆด ๊ฒƒ์ด๊ณ , ๋‚ฎ์€ ๋‚˜๋ฌด๋Š” ์ž˜๋ฆฌ์ง€ ์•Š์„ ๊ฒƒ์ด๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ํ•œ ์ค„์— ์—ฐ์†ํ•ด์žˆ๋Š” ๋‚˜๋ฌด์˜ ๋†’์ด๊ฐ€ 20, 15, 10, 17์ด๋ผ๊ณ  ํ•˜์ž. ์ƒ๊ทผ์ด๊ฐ€ ๋†’์ด๋ฅผ 15๋กœ ์ง€์ •ํ–ˆ๋‹ค๋ฉด, ๋‚˜๋ฌด๋ฅผ ์ž๋ฅธ ๋’ค์˜ ๋†’์ด๋Š” 15, 15, 10, 15๊ฐ€ ๋  ๊ฒƒ์ด๊ณ ,

์ƒ๊ทผ์ด๋Š” ๊ธธ์ด๊ฐ€ 5์ธ ๋‚˜๋ฌด์™€ 2์ธ ๋‚˜๋ฌด๋ฅผ ๋“ค๊ณ  ์ง‘์— ๊ฐˆ ๊ฒƒ์ด๋‹ค. (์ด 7๋ฏธํ„ฐ๋ฅผ ์ง‘์— ๋“ค๊ณ  ๊ฐ„๋‹ค) ์ ˆ๋‹จ๊ธฐ์— ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๋†’์ด๋Š” ์–‘์˜ ์ •์ˆ˜ ๋˜๋Š” 0์ด๋‹ค.

์ƒ๊ทผ์ด๋Š” ํ™˜๊ฒฝ์— ๋งค์šฐ ๊ด€์‹ฌ์ด ๋งŽ๊ธฐ ๋•Œ๋ฌธ์—, ๋‚˜๋ฌด๋ฅผ ํ•„์š”ํ•œ ๋งŒํผ๋งŒ ์ง‘์œผ๋กœ ๊ฐ€์ ธ๊ฐ€๋ ค๊ณ  ํ•œ๋‹ค. ์ด๋•Œ, ์ ์–ด๋„ M๋ฏธํ„ฐ์˜ ๋‚˜๋ฌด๋ฅผ ์ง‘์— ๊ฐ€์ ธ๊ฐ€๊ธฐ ์œ„ํ•ด์„œ ์ ˆ๋‹จ๊ธฐ์— ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋Š”

๋†’์ด์˜ ์ตœ๋Œ“๊ฐ’์„ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

๐Ÿ” ์ ‘๊ทผ๋ฒ•

Q.2805 ๋‚˜๋ฌด ์ž๋ฅด๊ธฐ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ์ ˆ๋‹จ๊ธฐ๋ฅผ ์ด์šฉํ•ด ์ง‘ ๊ทผ์ฒ˜์˜ ๋ชจ๋“  ๋‚˜๋ฌด๋“ค์„ ์ž˜๋ผ ์ ์–ด๋„

์ด ํ•ฉ M๋ฏธํ„ฐ์˜ ๋‚˜๋ฌด๋ฅผ ๊ฐ€์ ธ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ ์ค‘ ์ ˆ๋‹จ๊ธฐ ๋†’์ด๊ฐ€ ์ตœ๋Œ€๊ฐ€ ๋˜๋Š” ๊ฒฝ์šฐ๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

์ž˜๋ผ์ง„ ๋‚˜๋ฌด์˜ ๊ธธ์ด๊ฐ€ ์ •ํ™•ํžˆ M๋ฏธํ„ฐ์ธ ๊ฒฝ์šฐ๋งŒ ๊ฐ€์ ธ๊ฐ€๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ M๋ฏธํ„ฐ ์ด์ƒ์ด๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์—

M๋ฏธํ„ฐ ์ด์ƒ์˜ ๊ฒฝ์šฐ๋ฅผ ๋ชจ๋‘ ํ™•์ธํ•ด๋ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋‚˜๋ฌด๋“ค ์ค‘ ์ œ์ผ ๋†’์€ ๋‚˜๋ฌด์˜ ๋†’์ด๋ณด๋‹ค ์ ˆ๋‹จ๊ธฐ ๋†’์ด๋ฅผ ๋†’๊ฒŒ ์„ค์ •ํ•˜๋ฉด

์ž˜๋ฆฌ๋Š” ๋‚˜๋ฌด๊ฐ€ ํ•˜๋‚˜๋„ ์—†์œผ๋ฏ€๋กœ ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋ฏ€๋กœ ๋†’์ด๋ฅผ 0๋ถ€ํ„ฐ ์ œ์ผ ๊ธด ๋‚˜๋ฌด ๋†’์ด-1 ๊นŒ์ง€ ์ ˆ๋‹จ๊ธฐ ๋†’์ด๋ฅผ ์„ค์ •ํ•ด๋ณด๋ฉฐ

์ตœ๋Œ€๊ฐ’์ธ ๊ฒฝ์šฐ๋ฅผ ์ฐพ์œผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์ œ์ผ ์ฒ˜์Œ์—๋Š” ์„ ํ˜•ํƒ์ƒ‰์œผ๋กœ 0๋ถ€ํ„ฐ ์ œ์ผ ๊ธด ๋‚˜๋ฌด๋†’์ด -1 ๊นŒ์ง€ ์‚ดํŽด๋ณด์•˜๋”๋‹ˆ

์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ๋‚˜์™”๊ณ 

์‹œ๊ฐ„์„ ์ค„์ด๊ณ  ํšจ์œจ์ ์ธ ํ’€์ด๋ฅผ ์œ„ํ•ด

binary search๋ฅผ ์ด์šฉํ•ด์„œ ํ’€์ด๊ฐ€ ๊ฐ€๋Šฅํ•˜์˜€์Šต๋‹ˆ๋‹ค.

๐Ÿ’ป ์ฝ”๋“œ

์„ ํ˜•ํƒ์ƒ‰์„ ์ด์šฉํ•œ ํ’€์ด 1 (์‹œ๊ฐ„ ์ดˆ๊ณผ)

package problem.binary_search.Q2805;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashSet;
import java.util.Set;

public class Main_2805_1 {
    static int n, m;
    static int trees[];
    static int max = Integer.MIN_VALUE;
    static int answer = Integer.MIN_VALUE;

    public static void main(String[] args) throws IOException {
        input();
        solve();
        System.out.println(answer);
    }

    private static void input() throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] temp = br.readLine().split(" ");
        n = Integer.parseInt(temp[0]);
        m = Integer.parseInt(temp[1]);
        trees = new int[n];
        temp = br.readLine().split(" ");
        for(int i=0; i<n; i++){
            trees[i] = Integer.parseInt(temp[i]);
            max = Math.max(max,trees[i]);
        }
        br.close();
    }

    private static void solve(){
        for(int h=0; h<max; h++){
            int sum=0;
            for(int i=0; i<n; i++){
                if(trees[i] > h) {
                    sum += trees[i] - h;
                }
            }
            if(sum >= m) {
                answer = Math.max(answer, h);
            }
        }
    }
}

binary search ๋ฅผ ์ด์šฉํ•œ ํ’€์ด 2 (์ •๋‹ต)


package problem.binary_search.Q2805;

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

public class Main_2805_2 {
    static int n, m;
    static int trees[];
    static int max = Integer.MIN_VALUE;
    static int answer = Integer.MIN_VALUE;

    public static void main(String[] args) throws IOException {
        input();
        binarySearch();
        System.out.println(answer);
    }

    private static void input() throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] temp = br.readLine().split(" ");
        n = Integer.parseInt(temp[0]);
        m = Integer.parseInt(temp[1]);
        trees = new int[n];
        temp = br.readLine().split(" ");
        for(int i=0; i<n; i++){
            trees[i] = Integer.parseInt(temp[i]);
            max = Math.max(max,trees[i]);
        }
        br.close();
    }

    private static long caculateHeight(int h){
        long sum=0l;
        for(int i=0; i<n; i++){
            if(trees[i] > h) {
                sum += (trees[i] - h);
            }
        }
        return sum;
    }


    private static void binarySearch(){
        int start = 0;
        int end = max;
        while (start<=end) {
            long sum;
            int mid = (start+end)/2;
            sum = caculateHeight(mid);
            if(sum < m) {
                end = mid-1;
            }
            else {
                start = mid+1;
                answer = Math.max(answer, mid);
            }
        }

    }
}


Written on March 23, 2021