DevLog ๐Ÿ“จ/Baekjoon

[DevLog][Baekjoon] 2110: ๊ณต์œ ๊ธฐ ์„ค์น˜

cece00 2023. 8. 16. 01:19

01) ๋ฌธ์ œ

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

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

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

์ž…/์ถœ๋ ฅ

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

์ฒซ์งธ ์ค„์— ๊ฐ€์žฅ ์ธ์ ‘ํ•œ ๋‘ ๊ณต์œ ๊ธฐ ์‚ฌ์ด์˜ ์ตœ๋Œ€ ๊ฑฐ๋ฆฌ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

5 3
1
2
8
4
9
// output is 3

02) ํ’€์ด

  • ๊ตฌํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฒƒ์€ ๊ณต์œ ๊ธฐ ์‚ฌ์ด์˜ ๊ฑฐ๋ฆฌ D์ด๋‹ค.
  • ๊ณต์œ ๊ธฐ ์‚ฌ์ด์˜ ๊ฑฐ๋ฆฌ์˜ lower/upper bound๋ฅผ ์ •ํ•œ๋‹ค.
    • lower๋Š” 1 (์ง‘์€ ๋ชจ๋‘ ๋‹ค๋ฅธ ์ขŒํ‘œ์ด๋ฏ€๋กœ)
    • upper๋Š” ๋งˆ์ง€๋ง‰ ์ง‘์˜ ์ขŒํ‘œ - ์ฒซ๋ฒˆ์งธ ์ง‘์˜ ์ขŒํ‘œ
  • D์˜ ์กฐ๊ฑด์„ ์ƒ๊ฐํ•ด ๋ณธ๋‹ค.
    • ๊ฐ„๊ฒฉ์œผ๋กœ C๊ฐœ์˜ ๊ณต์œ ๊ธฐ๋ฅผ ๋ชจ๋‘ ์„ค์น˜ ๊ฐ€๋Šฅํ•ด์•ผ ํ•œ๋‹ค.
  • ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” D์˜ ์ตœ๋Œ“๊ฐ’์„ ์ฐพ๋Š”๋‹ค.
# ๊ฐ„๊ฒฉ์„ ๋งŒ์กฑํ•˜๋Š” ์ง‘์˜ ๊ฐœ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
def installable(๊ฐ„๊ฒฉ):
  curr = H[0] # ์ง‘ ๋ฐฐ์—ด H์˜ ์ฒซ๋ฒˆ์งธ ์ง‘ ๊ธฐ์ค€์œผ๋กœ
  for i in H[1] to end:
    if H[i] - curr >= ๊ฐ„๊ฒฉ:
      cnt += 1
      curr = H[i]
  return cnt

# ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ์ตœ๋Œ“๊ฐ’์„ ํƒ์ƒ‰ํ•ฉ๋‹ˆ๋‹ค.
s, e = lower, upper
while s <= e:
  mid = (s+e)//2
  # mid๋ฅผ ๊ฐ„๊ฒฉ์œผ๋กœ ํ–ˆ์„ ๋•Œ ์„ค์น˜ ๊ฐ€๋Šฅํ•œ ๊ณต์œ ๊ธฐ์˜ ์ˆ˜ cnt
  cnt = installable(mid) 
  if cnt < C: # ๋งŒ์•ฝ ๋ชจ๋“  ๊ณต์œ ๊ธฐ๋ฅผ ์„ค์น˜ํ•  ์ˆ˜ ์—†์œผ๋ฉด
    e = mid-1 # ๋” ์ข์€ ๊ฐ„๊ฒฉ์„ ๊ฒ€์ƒ‰
  else:
    s = mid + 1 # ๊ฐ„๊ฒฉ์„ ๋„“ํž˜ (์ตœ๋Œ€๋ฅผ ๊ตฌํ•˜๊ธฐ ์œ„ํ•ด)

์—ฌ๊ธฐ์— ์ค‘๊ฐ„์ค‘๊ฐ„ ๊ฐ„๊ฒฉ์˜ ์ตœ๋Œ“๊ฐ’์„ ์ €์žฅํ•ด์ฃผ๋Š” ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ๋œ๋‹ค. ๊ณต์œ ๊ธฐ์˜ ์„ค์น˜ ๊ฐ€๋Šฅ์„ ์ฒดํฌํ•˜๋Š” installable ๋ถ€๋ถ„์—์„œ mid๋ณด๋‹ค ํฐ ๊ฐ„๊ฒฉ์˜ ์ตœ์†Œ์น˜๋ฅผ ์ €์žฅํ•ด๋‘๋Š”๋ฐ, ์ด๋Š” ๊ฐ„๊ฒฉ์˜ lower bound๋ฅผ ๊ฐฑ์‹ ํ•˜์—ฌ ๋‹ต์„ ๊ตฌํ•˜๊ธฐ ์œ„ํ•จ์ด๋‹ค.

03) ์ฝ”๋“œ(ํŒŒ์ด์ฌ)

import sys

N, C = map(int, input().split())
X = [int(sys.stdin.readline()) for _ in range(N)]
X.sort()

upper = X[-1]-X[0]  
lower = 1  
s, e = lower, upper

while s <= e:
    mid = (s+e) // 2
    cnt = 1  
    diff = upper

    curr = X[0]
    for i in range(1, N):
        if X[i]-curr >= mid:
            diff = min(diff, (X[i]-curr))  
            cnt += 1
            curr = X[i]

    if cnt < C:
        e = mid-1 
    else:
        s = mid+1  
        lower = max(lower, diff)

print(lower)