Algorithm/๋ฐฑ์ค€

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

giraffe_ 2022. 3. 28. 22:02

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

 

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

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

www.acmicpc.net

 

 

 

 

 

์ด๋ถ„ํƒ์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค. ์ด์ „์— ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์—์„œ '์ž…๊ตญ์‹ฌ์‚ฌ' ๋ฌธ์ œ๋ฅผ ํ’€์—ˆ๋˜ ๊ฒƒ์ด ๋„์›€์ด ๋˜์—ˆ๋‹ค.

 

https://programmers.co.kr/learn/courses/30/lessons/43238

 

์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์—ฐ์Šต - ์ž…๊ตญ์‹ฌ์‚ฌ

n๋ช…์ด ์ž…๊ตญ์‹ฌ์‚ฌ๋ฅผ ์œ„ํ•ด ์ค„์„ ์„œ์„œ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ ์ž…๊ตญ์‹ฌ์‚ฌ๋Œ€์— ์žˆ๋Š” ์‹ฌ์‚ฌ๊ด€๋งˆ๋‹ค ์‹ฌ์‚ฌํ•˜๋Š”๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์ฒ˜์Œ์— ๋ชจ๋“  ์‹ฌ์‚ฌ๋Œ€๋Š” ๋น„์–ด์žˆ์Šต๋‹ˆ๋‹ค. ํ•œ ์‹ฌ์‚ฌ๋Œ€์—์„œ๋Š” ๋™์‹œ์— ํ•œ

programmers.co.kr

 

 

 

 

์ ˆ๋‹จ๊ธฐ์˜ ๋†’์ด(H)๋ฅผ ์ด๋ถ„ํƒ์ƒ‰์„ ํ†ตํ•ด ๊ตฌํ•œ๋‹ค.

 

1. ์ด๋ถ„ํƒ์ƒ‰์„ ์œ„ํ•ด ์ ˆ๋‹จ๊ธฐ์˜ ๋†’์ด๋ฅผ ์„ค์ •ํ•˜๋Š” ๋ฐ ์“ฐ์ผ ๋‚˜๋ฌด ๋ฐฐ์—ด์„ ์ •๋ ฌํ•œ๋‹ค.

2. ๊ฐ€๋Šฅํ•œ ์ ˆ๋‹จ๊ธฐ์˜ ๋†’์ด(H)์˜ ์ตœ์†Ÿ๊ฐ’(ํ•˜ํ•œ๊ฐ’)๊ณผ ์ตœ๋Œ“๊ฐ’(์ƒํ•œ๊ฐ’)์„ ๊ตฌํ•œ๋‹ค. 

3. mid ๊ฐ’์œผ๋กœ ์ ˆ๋‹จํ•˜๊ณ  ๋“ค๊ณ ๊ฐˆ ๋‚˜๋ฌด๋“ค์˜ ๋†’์ด ํ•ฉ์„ ๊ตฌํ•œ๋‹ค.

4. ํ•ฉ์„ ์ ์–ด๋„ ํ•„์š”ํ•œ ๋‚˜๋ฌด ๋†’์ด(M)๊ณผ ๋น„๊ตํ•œ๋‹ค

 - ํ•ฉ์ด M๋ณด๋‹ค ๋” ์ž‘์œผ๋ฉด->์ƒํ•œ๊ฐ’์„ ์ค„์ธ๋‹ค.

 - ํ•ฉ์ด M๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™์œผ๋ฉด ->ํ•˜ํ•œ๊ฐ’์„ ์ค„์ด๊ณ  ์ ˆ๋‹จ๊ธฐ์— ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๋†’์ด(์ •๋‹ต)๋ฅผ mid์œผ๋กœ ์ €์žฅํ•œ๋‹ค.

5. ํ•˜ํ•œ๊ฐ’<= ์ƒํ•œ๊ฐ’์ผ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•˜์—ฌ ์ ˆ๋‹จ๊ธฐ์— ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๋†’์ด(์ •๋‹ต)์„ ๊ฐฑ์‹ ํ•ด๋‚˜๊ฐ„๋‹ค.

 

 

 

 

 

์ฝ”๋“œ

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

public class CuttingTree {

	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

		String[] input1 = br.readLine().split(" ");
		int N = Integer.parseInt(input1[0]);
		int M = Integer.parseInt(input1[1]);
		
		int[] tree = new int[N];
		
		String[] input2 = br.readLine().split(" ");
		for(int i = 0; i < N; i++) {
			tree[i] = Integer.parseInt(input2[i]);
		}
		
		Arrays.sort(tree); //์ด๋ถ„ ํƒ์ƒ‰์„ ์œ„ํ•œ ์ •๋ ฌ
		
		int answer = 0;
		int low = 0; //H ์ตœ์†Œ
		int high = tree[tree.length - 1]; //H ์ตœ๋Œ€(๊ฐ€์žฅ ํฐ ๋‚˜๋ฌด)
		
		while(low <= high) {
			int mid = (low + high) / 2;
			
			long sum = 0;
			for(int i = 0; i < N; i++) {
				if(tree[i] > mid) { //์ ˆ๋‹จํ•˜๊ณ  ๋‚จ์œผ๋ฉด
					sum += (tree[i] - mid); //๋“ค๊ณ  ๊ฐ€๊ธฐ
				}
			}
			
			if(sum < M) { //M๋ณด๋‹ค ๋” ์ ์€ ๋‚˜๋ฌด ๊ฐ€์ ธ๊ฐ€๋ฉด
        		high = mid - 1; //H ์ค„์ด๊ธฐ
        	} else { //M๋ณด๋‹ค ๋” ๋งŽ์€ ๋‚˜๋ฌด ๊ฐ€์ ธ๊ฐ€๋ฉด
        		low = mid + 1; //H ๋Š˜๋ฆฌ๊ธฐ
        		answer = mid;
        	}
		}
		
		System.out.println(answer);
	}

}

 

*์ฃผ์˜ํ•  ์ *

๋†’์ด๋Š” 1,000,000,000๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์–‘์˜ ์ •์ˆ˜ ๋˜๋Š” 0์ด๋ฏ€๋กœ ์ž๋ฅด๊ณ  ๋‚จ์€ ๊ธธ์ด์˜ ํ•ฉ์€ int๊ฐ€ ๋‹ด์„ ์ˆ˜ ์žˆ๋Š” ํฌ๊ธฐ(2,147,483,647)๋ณด๋‹ค ํด ์ˆ˜๊ฐ€ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ž๋ฃŒํ˜•์„ long์œผ๋กœ ํ•ด์•ผ ํ•œ๋‹ค. ์ฒ˜์Œ์— ์•„๋ฌด ์ƒ๊ฐ ์—†์ด int๋กœ ํ–ˆ๋‹ค๊ฐ€ ํ‹€๋ ธ๋‹ค.

 

 

 

 

 

๊ฒฐ๊ณผ