03
06

 

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

 

2110๋ฒˆ: ๊ณต์œ ๊ธฐ ์„ค์น˜

์ฒซ์งธ ์ค„์— ์ง‘์˜ ๊ฐœ์ˆ˜ N (2 ≤ N ≤ 200,000)๊ณผ ๊ณต์œ ๊ธฐ์˜ ๊ฐœ์ˆ˜ C (2 ≤ C ≤ N)์ด ํ•˜๋‚˜ ์ด์ƒ์˜ ๋นˆ ์นธ์„ ์‚ฌ์ด์— ๋‘๊ณ  ์ฃผ์–ด์ง„๋‹ค. ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ N๊ฐœ์˜ ์ค„์—๋Š” ์ง‘์˜ ์ขŒํ‘œ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” xi (0 ≤ xi ≤ 1,000,000,000)๊ฐ€

www.acmicpc.net

 

 

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

public class Main {
	static int[] home;
	static int n;
	static int c;

	static int parametric() {
		int l = 0;
		int r = n - 1;
		int m = 0;
		while (l < r) {
			m = (l + r) / 2;
			if ((home[m] - home[l]) * (c - 2) <= home[r] - home[m]) { // yes
				l = m + 1;
			} else {
				r = m - 1;
			}
		}

		return home[m - 1] - home[0];
	}

	public static void main(String[] args) throws Exception {
		//System.setIn(new FileInputStream("res/input.txt"));
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine(), " ");

		n = Integer.parseInt(st.nextToken());
		c = Integer.parseInt(st.nextToken());

		home = new int[n];
		// ๊ทธ๋ž˜ํ”„ ์ดˆ๊ธฐํ™”
		for (int i = 0; i < n; i++) {
			home[i] = Integer.parseInt(br.readLine());
		}
		Arrays.sort(home);
		//System.out.println(Arrays.toString(home));

		System.out.println(parametric());
	}
}

์˜ค๋‹ต๋…ธํŠธ(ํ‘ธ๋Š” ๋™์•ˆ ์‚ฌ๊ณ ๊ณผ์ • ๋ฐ ๊ฐœ์„ ์ )

ํŒŒ๋ผ๋ฉ”ํŠธ๋ฆญ ์„œ์น˜๋ผ๋Š” ๊ฐœ๋…์„ ์ฒ˜์Œ ์•Œ๊ฒŒ ๋๋‹ค.

ํŒŒ๋ผ๋ฉ”ํŠธ๋ฆญ ์„œ์น˜๋ฅผ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ •๋ฆฌํ•˜๋ฉด ๊ฒฐ์ • ์กฐ๊ฑด์ด ์ถ”๊ฐ€๋œ ์ด๋ถ„ํƒ์ƒ‰์ด๋‹ค. ์ด๋ถ„ํƒ์ƒ‰์ด ํฐ ๋ฒ”์œ„, ์ž‘์€ ๋ฒ”์œ„๋ฅผ ์ขํ˜€๊ฐ€๋ฉฐ logN์œผ๋กœ ํƒ์ƒ‰ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ธ๋ฐ ์ด๋•Œ ๋ฒ”์œ„๋ฅผ ์ขํž ์กฐ๊ฑด์„ ์ถ”๊ฐ€ํ•œ ๊ฒŒ ํŒŒ๋ผ๋ฉ”ํŠธ๋ฆญ ์„œ์น˜๋ผ๋Š” ๊ฐœ๋…์ด๋‹ค.

 

์ด๋ถ„ ํƒ์ƒ‰์„ ๋‹ค์‹œ ์ƒ๊ฐํ•ด๋ณด์ž. m = (l + r) /2 ์œผ๋กœ, m์ด ์ปค์„œ์ผ ๋•Œ
m์ด ํƒ€๊ฒŸ๋ณด๋‹ค ์ž‘์œผ๋ฉด -> l์„ m+1๋กœ ๋•ก๊ฒจ์˜ค๊ณ 

m์ด ํƒ€๊ฒŸ๋ณด๋‹ค ํฌ๋ฉด -> r์„ m-1๋กœ ๋•ก๊ฒจ์˜จ๋‹ค

์ด๋•Œ m๊ณผ ํƒ€๊ฒŸ์„ ๋น„๊ตํ•˜๋Š” ๋ถ€๋ถ„์„ ๋–ผ๋‹ค๊ฐ€ ๋‚ด๊ฐ€ ์ฐพ์•„์•ผ๋˜๋Š” ์กฐ๊ฑด์œผ๋กœ ๋ฐ”๊พธ๋ฉด ์™„์„ฑ์ด๋‹ค.

 

์˜ค๋‹ต์ดํ›„ ๋‚ด๊ฐ€ ๋งŒ๋“  ์กฐ๊ฑด์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

static int count(int m) { // ๊ณต์œ ๊ธฐ ๊ฐœ์ˆ˜ ์„ธ๊ธฐ
		int cnt = 1; // ์‹œ์ž‘์ ์— ์„ค์น˜ํ•˜๊ณ  ์‹œ์ž‘ํ•จ.
		int prev = home[0];

		for (int i = 1; i < n; i++) {
			int d = home[i] - prev; // ํ˜„์žฌ ์ง€์ ๋ถ€ํ„ฐ i๋ฒˆ์งธ ์ง‘๊นŒ์ง€์˜ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ„์‚ฐํ•˜๊ธฐ
			if (d >= m) { // m๋ณด๋‹ค ํ˜„์žฌ ๊ฑฐ๋ฆฌ๊ฐ€ ํฌ๊ฑฐ๋‚˜ ๊ฐ™์œผ๋ฉด ๊ณต์œ ๊ธฐ๋ฅผ ๋†“๊ณ  ๊ฑฐ๋ฆฌ ๊ฐฑ์‹ 
				cnt++;
				prev = home[i]; // ์ด๋Ÿฌ๋ฉด ๋‹ค์Œ ๊ฐฑ์‹ ๋  ๊ฑฐ๋ฆฌ๋Š” ๋Š˜์–ด๋‚˜๊ฒŒ ๋จ -> c๋งŒํผ ๊ณต์œ ๊ธฐ ์„ค์น˜ํ•˜๋ฉด ์ตœ์žฅ๊ฑฐ๋ฆฌ ์™„์„ฑ
			}
		}
		return cnt;
}

cnt๊ฐ€ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ๋Š” ๊ณต์œ ๊ธฐ ๊ฐœ์ˆ˜๋‹ค. ๊ณต์œ ๊ธฐ๋ฅผ C๊ฐœ ๋งŒํผ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ๊ทธ๊ฒŒ ์ข…๋ฃŒ ์กฐ๊ฑด์ด ๋  ์ˆ˜ ์žˆ๋Š”๋ฐ ๊ทธ๊ฑด ์ด count ํ•จ์ˆ˜๋ฅผ ๋Œ๋ฉด์„œ ๊ฒฐ์ •ํ•œ๋‹ค.

ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ m์ด ๋“ค์–ด์˜ค๋ฉด ์ด๋•Œ m์€ ๊ณต์œ ๊ธฐ๋ฅผ ์„ค์น˜ํ•˜๊ธฐ์œ„ํ•ด ์ด๋™ํ•  ์‹œ์ž‘ ๊ฑฐ๋ฆฌ๋‹ค.


์ •๋‹ต์ฝ”๋“œ

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

public class Main {
	static int[] home;
	static int n;
	static int c;

	static int count(int m) { // ๊ณต์œ ๊ธฐ ๊ฐœ์ˆ˜ ์„ธ๊ธฐ
		int cnt = 1; // ์‹œ์ž‘์ ์— ์„ค์น˜ํ•˜๊ณ  ์‹œ์ž‘ํ•จ.
		int prev = home[0];

		for (int i = 1; i < n; i++) {
			int d = home[i] - prev; // ํ˜„์žฌ ์ง€์ ๋ถ€ํ„ฐ i๋ฒˆ์งธ ์ง‘๊นŒ์ง€์˜ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ„์‚ฐํ•˜๊ธฐ
			if (d >= m) { // m๋ณด๋‹ค ํ˜„์žฌ ๊ฑฐ๋ฆฌ๊ฐ€ ํฌ๊ฑฐ๋‚˜ ๊ฐ™์œผ๋ฉด ๊ณต์œ ๊ธฐ๋ฅผ ๋†“๊ณ  ๊ฑฐ๋ฆฌ ๊ฐฑ์‹ 
				cnt++;
				prev = home[i]; // ์ด๋Ÿฌ๋ฉด ๋‹ค์Œ ๊ฐฑ์‹ ๋  ๊ฑฐ๋ฆฌ๋Š” ๋Š˜์–ด๋‚˜๊ฒŒ ๋จ -> c๋งŒํผ ๊ณต์œ ๊ธฐ ์„ค์น˜ํ•˜๋ฉด ์ตœ์žฅ๊ฑฐ๋ฆฌ ์™„์„ฑ
			}
		}
		return cnt;
	}

	static int parametric() {
		int l = 0;
		int r = home[n - 1] - home[0];// ์ตœ๋Œ€ ๊ฑฐ๋ฆฌ -> ์‚ฌ๋žŒ ์œ„์น˜ ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ผ ๊ฑฐ๋ฆฌ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์žก๋Š”๋‹ค.
		
		int ans = 0;

		while (l <= r) {
			int m = (l + r) / 2;
			int cnt = count(m);
			if (cnt >= c) { // ๊ณต์œ ๊ธฐ ๋Š˜๋ฆด ์ˆ˜ ์žˆ์Œ
				ans = m;
				l = m + 1;
			} else { // ๊ณต์œ ๊ธฐ ์ค„์—ฌ์•ผ ํ•จ
				r = m - 1;
			}
		}

		return ans;
	}

	public static void main(String[] args) throws Exception {
		//System.setIn(new FileInputStream("res/input.txt"));
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine(), " ");

		n = Integer.parseInt(st.nextToken());
		c = Integer.parseInt(st.nextToken());

		home = new int[n];
		// ๊ทธ๋ž˜ํ”„ ์ดˆ๊ธฐํ™”
		for (int i = 0; i < n; i++) {
			home[i] = Integer.parseInt(br.readLine());
		}
		Arrays.sort(home);
		//System.out.println(Arrays.toString(home));

		System.out.println(parametric());
	}
}

 

๋„์›€์ด ๋๋‹ค๋ฉด ๋Œ“๊ธ€์ด๋‚˜ ๊ณต๊ฐ ๋ฒ„ํŠผ ํ•œ ๋ฒˆ์”ฉ ๋ˆ„๋ฅด๊ณ  ๊ฐ€์ฃผ์„ธ์š”! ๋กœ๊ทธ์ธ ์•ˆํ•ด๋„ ๋ฉ๋‹ˆ๋‹ค ^_^

 

๋ฐ˜์‘ํ˜•
COMMENT