J

[JAVA] BOJ ๋ฐฑ์ค€ 2110 ๊ณต์œ ๊ธฐ ์„ค์น˜ ๋ณธ๋ฌธ

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

[JAVA] BOJ ๋ฐฑ์ค€ 2110 ๊ณต์œ ๊ธฐ ์„ค์น˜

snowball๐Ÿฐ 2023. 2. 27. 13:49

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

๋ฌธ์ œ

๋„ํ˜„์ด์˜ ์ง‘ N๊ฐœ๊ฐ€ ์ˆ˜์ง์„  ์œ„์— ์žˆ๋‹ค. ๊ฐ๊ฐ์˜ ์ง‘์˜ ์ขŒํ‘œ๋Š” x1, ..., xN์ด๊ณ , ์ง‘ ์—ฌ๋Ÿฌ๊ฐœ๊ฐ€ ๊ฐ™์€ ์ขŒํ‘œ๋ฅผ ๊ฐ€์ง€๋Š” ์ผ์€ ์—†๋‹ค.

๋„ํ˜„์ด๋Š” ์–ธ์ œ ์–ด๋””์„œ๋‚˜ ์™€์ดํŒŒ์ด๋ฅผ ์ฆ๊ธฐ๊ธฐ ์œ„ํ•ด์„œ ์ง‘์— ๊ณต์œ ๊ธฐ C๊ฐœ๋ฅผ ์„ค์น˜ํ•˜๋ ค๊ณ  ํ•œ๋‹ค. ์ตœ๋Œ€ํ•œ ๋งŽ์€ ๊ณณ์—์„œ ์™€์ดํŒŒ์ด๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ํ•œ ์ง‘์—๋Š” ๊ณต์œ ๊ธฐ๋ฅผ ํ•˜๋‚˜๋งŒ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ๊ณ , ๊ฐ€์žฅ ์ธ์ ‘ํ•œ ๋‘ ๊ณต์œ ๊ธฐ ์‚ฌ์ด์˜ ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐ€๋Šฅํ•œ ํฌ๊ฒŒ ํ•˜์—ฌ ์„ค์น˜ํ•˜๋ ค๊ณ  ํ•œ๋‹ค.

C๊ฐœ์˜ ๊ณต์œ ๊ธฐ๋ฅผ N๊ฐœ์˜ ์ง‘์— ์ ๋‹นํžˆ ์„ค์น˜ํ•ด์„œ, ๊ฐ€์žฅ ์ธ์ ‘ํ•œ ๋‘ ๊ณต์œ ๊ธฐ ์‚ฌ์ด์˜ ๊ฑฐ๋ฆฌ๋ฅผ ์ตœ๋Œ€๋กœ ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

์ž…๋ ฅ

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

์ „์ฒด ์ฝ”๋“œ

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

public class Main {
	static int C, N;
	static long[] wifi;
	public static void main(String[] args) throws Exception {
		BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(bf.readLine(), " ");
		N = Integer.parseInt(st.nextToken());
		C = Integer.parseInt(st.nextToken());
		
		wifi = new long[N];
		for(int i=0; i<N; i++)
			wifi[i] = Long.parseLong(bf.readLine());
		Arrays.sort(wifi);
		find(wifi[N-1] - wifi[0]);
	}
	static void find(long x) {
		long start = 0; long end = x;
		while(start <= end) {// ๋‘ ๊ฐ’์ด ๊ฐ™์•„์ง€๋Š” ๊ฒฝ์šฐ ๋๋‚˜๊ฒŒ ๋จ
			long mid = (start + end) / 2; // ๊ณต์œ ๊ธฐ ์‚ฌ์ด์˜ ๊ฐ€๋Šฅํ•œ ๊ฑฐ๋ฆฌ
			if(find_dist(mid)) start = mid+1;
			else end = mid - 1;
		}
		System.out.println(start-1);
	}
	static boolean find_dist(long m) {
		int start = 0; int cnt = 1;
		for(int i=0; i<N; i++) {
			if(wifi[i] - wifi[start] >= m) {start = i; cnt++;}
		}
		if(cnt < C) return false;
		else return true;
	}
}
๐Ÿ’ก ์ด๋ถ„ํƒ์ƒ‰์—์„œ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์€ while์˜ ์กฐ๊ฑด๊ณผ start, end์˜ ๊ฐฑ์‹ ๊ณผ ๊ฐฑ์‹  ์กฐ๊ฑด์ด๋‹ค.
์ด ๋ฌธ์ œ์—์„œ ์ •๋‹ต์ด ๋  ๊ธธ์ด๋Š” ๊ณต์œ ๊ธฐ์˜ ๊ฐœ์ˆ˜๋ฅผ C๋กœ ๋งŒ๋“œ๋Š” ๊ฑฐ๋ฆฌ์ด์ด๋‹ค.
๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์กฐ๊ฑด์€ ๊ฐœ์ˆ˜๊ฐ€ C๋ณด๋‹ค (์ž‘๊ฑฐ๋‚˜) (ํฐ๊ฑฐ๋‚˜ ๊ฐ™์€) ๋‘ ๊ฒฝ์šฐ๋กœ ๋ถ„๋ฆฌํ•ด์•ผ ํ•œ๋‹ค.
while์˜ ์กฐ๊ฑด์„ min ≤ max๋กœ ์„ค์ •ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— while์ด ์ข…๋ฃŒ๋˜๋ฉด min = max+1์˜ ํ˜•ํƒœ๊ฐ€ ๋œ๋‹ค.
์ •๋‹ต์ด ๋˜๋Š” mid๋Š” else ์กฐ๊ฑด์— ์˜ํ•ด mid-1์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฒฐ๊ตญ ๊ฒฐ๊ณผ๊ฐ’์€ max๋‚˜ min-1์„ ์ถœ๋ ฅํ•ด์•ผ ๋œ๋‹ค.
while(min < max)์ธ ๊ฒฝ์šฐ๋Š” ๋‘ ๊ฐ’์ด ๊ฐ™์€ ๊ฒฝ์šฐ while์„ ๋น ์ ธ๋‚˜์˜ค๋Š”๋ฐ ์ด ๊ฒฝ์šฐ ๋ฌดํ•œ loop๋ฅผ ๋„๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ƒ๊ธฐ๊ฒŒ ๋œ๋‹ค.
Comments