J

[JAVA] BOJ ๋ฐฑ์ค€ 2805 ๋‚˜๋ฌด์ž๋ฅด๊ธฐ ๋ณธ๋ฌธ

๐Ÿ”‘ Problem Solving/๐Ÿ‡ BOJ

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

snowball๐Ÿฐ 2023. 2. 27. 11:47

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

 

2805๋ฒˆ: ๋‚˜๋ฌด ์ž๋ฅด๊ธฐ

์ฒซ์งธ ์ค„์— ๋‚˜๋ฌด์˜ ์ˆ˜ N๊ณผ ์ƒ๊ทผ์ด๊ฐ€ ์ง‘์œผ๋กœ ๊ฐ€์ ธ๊ฐ€๋ ค๊ณ  ํ•˜๋Š” ๋‚˜๋ฌด์˜ ๊ธธ์ด M์ด ์ฃผ์–ด์ง„๋‹ค. (1 ≤ N ≤ 1,000,000, 1 ≤ M ≤ 2,000,000,000) ๋‘˜์งธ ์ค„์—๋Š” ๋‚˜๋ฌด์˜ ๋†’์ด๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๋‚˜๋ฌด์˜ ๋†’์ด์˜ ํ•ฉ์€ ํ•ญ์ƒ M๋ณด

www.acmicpc.net

๋ฌธ์ œ

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

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

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

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ๋‚˜๋ฌด์˜ ์ˆ˜ N๊ณผ ์ƒ๊ทผ์ด๊ฐ€ ์ง‘์œผ๋กœ ๊ฐ€์ ธ๊ฐ€๋ ค๊ณ  ํ•˜๋Š” ๋‚˜๋ฌด์˜ ๊ธธ์ด M์ด ์ฃผ์–ด์ง„๋‹ค. (1 ≤ N ≤ 1,000,000, 1 ≤ M ≤ 2,000,000,000)

๋‘˜์งธ ์ค„์—๋Š” ๋‚˜๋ฌด์˜ ๋†’์ด๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๋‚˜๋ฌด์˜ ๋†’์ด์˜ ํ•ฉ์€ ํ•ญ์ƒ M๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™๊ธฐ ๋•Œ๋ฌธ์—, ์ƒ๊ทผ์ด๋Š” ์ง‘์— ํ•„์š”ํ•œ ๋‚˜๋ฌด๋ฅผ ํ•ญ์ƒ ๊ฐ€์ ธ๊ฐˆ ์ˆ˜ ์žˆ๋‹ค. ๋†’์ด๋Š” 1,000,000,000๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์–‘์˜ ์ •์ˆ˜ ๋˜๋Š” 0์ด๋‹ค.

์ „์ฒด ์ฝ”๋“œ

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

public class Main {
	static int N;
	static long M;
	static long[] tree;
	static long result = 0;
    public static void main(String[] args) throws Exception {
       BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
       StringBuilder sb = new StringBuilder();
       StringTokenizer st = new StringTokenizer(bf.readLine(), " ");
       N = Integer.parseInt(st.nextToken());
       M = Long.parseLong(st.nextToken());
       tree = new long[N]; long max = 0; long min = Long.MAX_VALUE;
       st = new StringTokenizer(bf.readLine(), " ");
       for(int i =0 ;i<N; i++) {
    	   tree[i] = Long.parseLong(st.nextToken());
    	   max = Math.max(max, tree[i]);
    	   min = Math.min(min, tree[i]);
       }
       cut(min, max);
       
    }
    static void cut(long start, long end) {
    	long min = 0; long max = end;
		while(min <= max) {
			long mid = (min + max) / 2;
			long sum = 0;
			for(long h : tree) {
				if(h - mid > 0) { 
					sum += (h - mid);
				}
			}
			if(sum < M) {
				max = mid-1;
			}
			else {
				min = mid + 1;
			}
		}
		System.out.println(max);
	}
}
๐Ÿ’ก ์ด๋ถ„ํƒ์ƒ‰์—์„œ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์€ while์˜ ์กฐ๊ฑด๊ณผ min, max์˜ ๊ฐฑ์‹ ๊ณผ ๊ฐฑ์‹  ์กฐ๊ฑด์ด๋‹ค.
์ด ๋ฌธ์ œ์—์„œ ์ •๋‹ต์ด ๋  H๋Š” M์ด๊ฑฐ๋‚˜ M๋ณด๋‹ค ํฐ ๋‚˜๋ฌด๋ฅผ ์ž๋ฅด๋Š” ๋†’์ด์ด๋‹ค.
๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์กฐ๊ฑด์€ sum์ด M๋ณด๋‹ค (์ž‘๊ฑฐ๋‚˜) (๊ฐ™๊ฑฐ๋‚˜ ํฐ) ๋‘ ๊ฒฝ์šฐ๋กœ ๋ถ„๋ฆฌํ•ด์•ผ ํ•œ๋‹ค.
while์˜ ์กฐ๊ฑด์„ min ≤ max๋กœ ์„ค์ •ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— while์ด ์ข…๋ฃŒ๋˜๋ฉด min = max+1์˜ ํ˜•ํƒœ๊ฐ€ ๋œ๋‹ค.
์ •๋‹ต์ด ๋˜๋Š” mid๋Š” else ์กฐ๊ฑด์— ์˜ํ•ด mid+1์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฒฐ๊ตญ ๊ฒฐ๊ณผ๊ฐ’์€ max๋‚˜ min-1์„ ์ถœ๋ ฅํ•ด์•ผ ๋œ๋‹ค.
while(min < max)์ธ ๊ฒฝ์šฐ๋Š” ๋‘ ๊ฐ’์ด ๊ฐ™์€ ๊ฒฝ์šฐ while์„ ๋น ์ ธ๋‚˜์˜ค๋Š”๋ฐ ์ด ๊ฒฝ์šฐ ๋ฌดํ•œ loop๋ฅผ ๋„๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ƒ๊ธฐ๊ฒŒ ๋œ๋‹ค.
Comments