๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ ํ’€์ด/Binary Search

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

by syLim___ 2023. 3. 10.
728x90

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


์ฒ˜์Œ ํ’€์ด

1. ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์กฐํ•ฉ nCc๋ฅผ ๊ตฌํ•œ๋‹ค

2. ๊ฐ€์žฅ ๋–จ์–ด์ง„ ๋‘ ๊ณต์œ ๊ธฐ ์‚ฌ์ด์˜ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•œ๋‹ค

from itertools import combinations

def minDist(arr):
  result=1e9
  for i in range(len(arr)-1):
    result = min(result,arr[i+1]-arr[i])
  return result
  
n, c = map(int,input().split())
houses=[]
for i in range(n):
  houses.append(int(input()))

houses.sort()

combi = list(combinations(houses,c))

result=0
for i in combi:
  result = max(minDist(i),result)

print(result)

๊ฒฐ๊ณผ: ๋ฉ”๋ชจ๋ฆฌ ์ดˆ๊ณผ

 

์กฐํ•ฉ์„ ๊ตฌํ•ด์„œ ๋ฆฌ์ŠคํŠธ์— ์ €์žฅํ•˜๋Š” ๊ณผ์ •์—์„œ ๋ฉ”๋ชจ๋ฆฌ ์ดˆ๊ณผ๊ฐ€ ๋‚œ ๋“ฏ.

n๊ณผ c๊ฐ€ ์ตœ๋Œ€ 20๋งŒ๊นŒ์ง€ ๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ.


๋‘ ๋ฒˆ์งธ ํ’€์ด: binary search

 

๋‘ ๊ณต์œ ๊ธฐ ์‚ฌ์ด์˜ ๊ฑฐ๋ฆฌ๋Š” 1~10์–ต์ด ๋  ์ˆ˜ ์žˆ๋‹ค. (๋ฌธ์ œ์กฐ๊ฑด: ์ง‘ ์ขŒํ‘œ๋Š” 0๋ถ€ํ„ฐ 10์–ต)

 

๋‘ ๊ณต์œ ๊ธฐ ์‚ฌ์ด์˜ ๊ฐ„๊ฒฉ์„ x๋กœ ํ•˜์—ฌ, ๊ณต์œ ๊ธฐ๋ฅผ 1๋ฒˆ ์ง‘๋ถ€ํ„ฐ ๋งˆ์ง€๋ง‰ ์ง‘๊นŒ์ง€ ์ฐจ๋ก€๋Œ€๋กœ ์„ค์น˜ํ•ด๋ณธ๋‹ค.

์ตœ์ข…์ ์œผ๋กœ ์„ค์น˜๋˜๋Š” ๊ณต์œ ๊ธฐ์˜ ์ˆ˜๊ฐ€ c๊ฐœ๋ณด๋‹ค ๋งŽ๋‹ค๋ฉด, ๋‘ ๊ณต์œ ๊ธฐ ์‚ฌ์ด์˜ ์ตœ๋Œ€ ๊ฐ„๊ฒฉ์€ x๋ณด๋‹ค ์ปค์งˆ ์ˆ˜ ์žˆ๋‹ค. --> x๋ฅผ ์ €์žฅํ•˜๊ณ  x๋ฅผ ๋Š˜๋ ค์ค€๋‹ค.

์ตœ์ข…์ ์œผ๋กœ ์„ค์น˜๋˜๋Š” ๊ณต์œ ๊ธฐ์˜ ์ˆ˜๊ฐ€ c๊ฐœ๋ณด๋‹ค ์ ์œผ๋ฉด, ๊ณต์œ ๊ธฐ ์‚ฌ์ด์˜ ๊ฐ„๊ฒฉ์„ ์ค„์—ฌ์•ผ ๊ณต์œ ๊ธฐ๋ฅผ c๊ฐœ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ๋‹ค. --> x๋ฅผ ์ค„์—ฌ์ค€๋‹ค.

 

์ด๋ ‡๊ฒŒ x๋ฅผ ์ค‘๊ฐ„๊ฐ’๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์—ฌ ์กฐ์ •ํ•ด๊ฐ€๋ฉด์„œ ๊ณต์œ ๊ธฐ ๊ฐœ์ˆ˜๋ฅผ ํŒŒ์•…ํ•˜๋ฉด ๋œ๋‹ค.

์ด๋•Œ, ์ง‘ ์ขŒํ‘œ๊ฐ€ ๋ฌด์ž‘์œ„๋กœ ์ž…๋ ฅ๋˜๋ฏ€๋กœ x๋ฅผ ์กฐ์ •ํ•˜๋Š” ์ž‘์—…์„ ํ•˜๊ธฐ ์ „์— ์ง‘ ์ขŒํ‘œ๋ฅผ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

 

import sys
input = sys.stdin.readline

n, c = map(int,input().split())
houses=[]
for i in range(n):
  houses.append(int(input()))

houses.sort() #์ง‘ ์ขŒํ‘œ ์ •๋ ฌ

start = 1
end = houses[-1]-houses[0]
answer = 0

while start <= end:
  mid = (start+end)//2
  cur = houses[0]
  cnt=1

  #1๋ฒˆ ์ง‘๋ถ€ํ„ฐ ๊ฐ„๊ฒฉ์„ mid๋กœ ํ•˜์—ฌ ๊ณต์œ ๊ธฐ ์„ค์น˜ํ•ด๋ณด๊ธฐ
  for i in range(1,n):
    if houses[i] >= cur+mid:
      cur=houses[i]
      cnt += 1
      
  #์„ค์น˜๋œ ๊ณต์œ ๊ธฐ ์ˆ˜๊ฐ€ c๋ณด๋‹ค ๋งŽ์œผ๋ฉด ๊ฐ„๊ฒฉ์„ ์ €์žฅํ•˜๊ณ  ์ฆ๊ฐ€์‹œํ‚ค๊ธฐ
  if cnt >= c:
    start = mid+1
    answer=mid
  #์„ค์น˜๋œ ๊ณต์œ ๊ธฐ ์ˆ˜๊ฐ€ c๋ณด๋‹ค ์ ์œผ๋ฉด ๊ฐ„๊ฒฉ์„ ๊ฐ์†Œ์‹œํ‚ค๊ธฐ
  else:
    end = mid-1

print(answer)

 

์ž…๋ ฅ์„ readline์ด ์•„๋‹ˆ๋ผ input์œผ๋กœ ๋ฐ›์œผ๋ฉด ๋ฐฑ์ค€์—์„œ๋Š” ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ๋‚˜๋‹ˆ๊นŒ ์กฐ์‹ฌ

728x90