๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ’๊ณต๋ถ€/์•Œ๊ณ ๋ฆฌ์ฆ˜

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

by rindev 2020. 11. 24.

why...

 

www.acmicpc.net/problem/2110

 

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

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

www.acmicpc.net

์™œ...

์ด๊ฑฐ ์ง„์งœ ๋ฌธ์ œ๋ฅผ ์ดํ•ดํ•˜๋Š”๋ฐ๋งŒ.. ํ•œ์ฐธ ๊ฑธ๋ฆฐ๋“ฏใ… ใ…  ์ž๊ดด๊ฐ๋“ค์–ด์š”........ ์ด๋ถ„ํƒ์ƒ‰ ๋„ˆ๋ฌด ์–ด๋ ค์›Œ...

์‹œ์ž‘์กฐ์ฐจ ํ•˜์ง€๋ชปํ•˜๊ณ  ๊ณ ๋ฏผ๋งŒ ๋„ˆ๋ฌด ์˜ค๋ž˜ํ•ด์„œ ๊ฒฐ๊ตญ ๊ตฌ๊ธ€์˜ ํž˜์„ ๋นŒ๋ ธ๊ณ .. ๋จผ์ € ํ’€์–ด๋ณด์‹  ๋ถ„๋“ค ์กด๊ฒฝํ•˜๊ณ  ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค๐Ÿ˜ญ

 

์ฒ˜์Œ์—๋Š” ๊ฐ€์žฅ ์ฒซ ์ง‘, ๋์ง‘์— ๋ฌด์กฐ๊ฑด ๊ณต์œ ๊ธฐ๋ฅผ ๋†“๊ณ  ๊ฐ€์šด๋ฐ๋ฅผ ์–ด๋–ป๊ฒŒ ์˜ฎ๊ฒจ์•ผ ํ•˜๋‚˜ ๊ณ ๋ฏผ์„ ํ–ˆ๋Š”๋ฐ

์ข€๋” ๋‚ด๊ฐ€ ํ’€์–ด๋ณผ๋งŒํ•œ? ์ฝ”๋“œ๋กœ ์งœ๋ณผ๋งŒํ•œ? ์„ค๋ช…์„ ํ•˜๋‚˜ ์ฝ์–ด์„œ ๊ทธ๊ฑธ ํ† ๋Œ€๋กœ ๋‹ค์‹œ ๊ณ ๋ฏผ


์ค‘์š”ํ–ˆ๋˜ ๊ฒƒ

  • ์ง‘์€ ์ค‘๋ณต๋œ ์ขŒํ‘œ๊ฐ€ ์—†์œผ๋ฏ€๋กœ ์ง‘๊ณผ ์ง‘ ์‚ฌ์ด์˜ ์ตœ์†Œ ๊ฐ„๊ฒฉ์€ ๋ฌด์กฐ๊ฑด 1 ์ด๋‹ค!!! (s = 1)
  • ์ง‘~์ง‘ ์‚ฌ์ด์˜ ์ตœ๋Œ€ ๊ฐ„๊ฒฉ์€ ์ฒซ์ง‘~๋์ง‘  (e = house[-1] - house[0])
  • ๊ทธ๋ž˜์„œ ์ง‘๊ณผ ์ง‘ ์‚ฌ์ด์˜ ๊ฐ„๊ฒฉ(dist)๋ฅผ ์ตœ์†Œ(s)์™€ ์ตœ๋Œ€(e) ์‚ฌ์ด์—์„œ ์™”๋‹ค๊ฐ”๋‹ค ํ•˜๋ฉด์„œ ์ ๋‹นํ•œ ๊ฐ’์„ ์ฐพ๋Š”๊ฒƒ์ด ๋ชฉํ‘œ.

 

์ฝ”๋“œ ์ด์ „์— ์‹คํ–‰ํ™”๋ฉด ๋จผ์ €!

๋‚˜๋Š” dist = 4์นธ ์ด์ƒ์”ฉ ๋–จ์–ด๋œจ๋ ค์„œ ๊ณต์œ ๊ธฐ๋ฅผ ์„ค์น˜ํ•˜๊ณ ์‹ถ๋‹ค

๊ทธ๋ž˜์„œ ์ฒซ์ง‘(A)์—๋Š” ๋ฌด์กฐ๊ฑด ๊ณต์œ ๊ธฐ๋ฅผ ์ผ๋‹จ ์„ค์น˜ํ•˜๊ณ (cnt = 1), 4์นธ์”ฉ ๊ฐ€๋ฉด์„œ ๊ณต์œ ๊ธฐ๋ฅผ ๋‹ฌ ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ• ๊ฒƒ์ด๋‹ค.

for๋ฌธ์„ ๋Œ๋ฉด์„œ ๊ฐ ์ง‘๋งˆ๋‹ค ํ™•์ธ์„ ํ•œ๋‹ค.

  • B๋Š” 1์นธ๋ฐ–์— ์ฐจ์ด๊ฐ€ ์•ˆ๋‚˜์„œ ์•ˆ๋จ
  • C๋„ 3์นธ ๋–จ์–ด์ ธ์„œ ์•ˆ๋จ 
  • D๋Š” 7์นธ ๋–จ์–ด์ ธ์žˆ์–ด์„œ ํ•ฉ๊ฒฉ! ๊ณต์œ ๊ธฐ ํ•˜๋‚˜ ์„ค์น˜! cnt = 2 ํ•˜๊ณ , ์ด์ œ๋Š” D๋ฅผ ๊ธฐ์ค€์œผ๋กœ 4์นธ ๋–จ์–ด์ง„ ๋‹ค์Œ ์ง‘์„ ์ฐพ๊ณ ์‹ถ๋‹ค
  • E๋Š” D์™€ 1์นธ ๋–จ์–ด์ ธ์žˆ๊ธฐ๋•Œ๋ฌธ์— ์•ˆ๋จ

๊ทธ๋ ‡๊ฒŒ ๋ชจ๋“  ์ง‘์„ ๋‹ค ๋Œ์•„์„œ ๊ณต์œ ๊ธฐ๋ฅผ ์ด 2๊ฐœ ์„ค์น˜ํ•œ๊ฒŒ ์œ„์˜ ๊ฒฝ์šฐ์ด๋‹ค. 3๊ฐœ ์„ค์น˜ํ•˜๊ณ ์‹ถ์—ˆ๋Š”๋ฐ ๋„ˆ๋ฌด ์ ๋‹ค. 

 

๊ณต์œ ๊ธฐ๊ฐ€ ๋„ˆ๋ฌด ์ ๊ฒŒ ์„ค์น˜๋œ๊ฑธ ๋ณด๋‹ˆ ๊ฑฐ๋ฆฌ๊ฐ€ ๋„ˆ๋ฌด ๋“ฌ์„ฑ๋“ฌ์„ฑ ํ–ˆ๋˜๊ฒƒ๊ฐ™์•„์„œ ๊ฑฐ๋ฆฌ๋ฅผ ์ค„์ด๊ฒŒ ๋๋‹ค (e = c - 1)

dist ๋ฅผ ๊ณ„์‚ฐํ•˜๋ฉด 2๊ฐ€ ๋‚˜์˜จ๋‹ค.

A์— ๊ณต์œ ๊ธฐ๋ฅผ ์‹ฌ์–ด์„œ cnt = 1

  • A~B๋Š” 1์นธ์ด๋ผ ์‹คํŒจ
  • A~C๋Š” 3์นธ์ด๋ผ ์„ฑ๊ณต cnt = 2
  • C~D๋Š” 4์นธ์ด๋ผ ์„ฑ๊ณต cnt = 3
  • D~E๋Š” 1์นธ์ด๋ผ ์‹คํŒจ

์ด cnt = 3์œผ๋กœ ๋‚ด๊ฐ€ ์›ํ•˜๋Š”๋งŒํผ ๊ณต์œ ๊ธฐ๋ฅผ ์„ค์น˜ํ•˜๊ธฐ๋Š” ํ–ˆ์ง€๋งŒ

 

๊ฐ„๊ฒฉ์„ ์ข€ ํ‚ค์›Œ๋ณด๊ธฐ๋กœ ํ•˜์—ฌ s = c + 1 ๋กœ ๋ณ€๊ฒฝ. dist = 3์ด ๋๋‹ค

A์— ๊ณต์œ ๊ธฐ ์‹ฌ์–ด์„œ cnt = 1

  • A~B๋Š” ๊ฑฐ๋ฆฌ 1๋กœ ์‹คํŒจ
  • A~C๋Š” ๊ฑฐ๋ฆฌ 3์œผ๋กœ ์„ฑ๊ณต cnt = 2
  • C~D๋Š” ๊ฑฐ๋ฆฌ 4๋กœ ์„ฑ๊ณต cnt = 3
  • D~E๋Š” ๊ฑฐ๋ฆฌ 1 ์‹คํŒจ

๊ณต์œ ๊ธฐ 3๊ฐœ๋ฅผ ์‹ฌ์—ˆ๋Š”๋ฐ, dist๋Š” 3์ด ๋˜๋ฏ€๋กœ ์ด๊ฒŒ ๋‹ต์ด ๋จ... 

 


๐Ÿƒ‍โ™€๏ธ์ž‘์„ฑํ•œ ์ฝ”๋“œ

๋”๋ณด๊ธฐ
# 2110 ๋ฒˆ : ๊ณต์œ ๊ธฐ ์„ค์น˜
def binary_search_2110():
  # n, c = map(int, input().split())
  # house = []
  # for _ in range(n):
  #   house.append(int(input())) #์ง‘์˜ ์ขŒํ‘œ๋ฅผ ์ž…๋ ฅ๋ฐ›์Œ

  n = 5
  c = 3
  house = [1,2,8,4,9]

  house.sort() #1,2,4,8,9

  e = house[-1] - house[0] #์ฒซ์ง‘์—์„œ ๋์ง‘๊นŒ์ง€์˜ ๊ฑฐ๋ฆฌ : ๊ฐ„๊ฒฉ์ค‘ ์ตœ๋Œ€ ๊ฐ„๊ฒฉ
  s = 1 #๊ฐ„๊ฒฉ์ค‘ ์ตœ์†Œ๊ฐ„๊ฒฉ (์ตœ์†Œ๊ฐ„๊ฒฉ์ด ๋ ์ˆ˜์žˆ๋Š”๊ฑด 1์ž„. ์ค‘๋ณต ์ขŒํ‘œ๊ฐ€ ์—†๋‹ค๊ณ  ํ–ˆ์œผ๋‹ˆ 0 ๋ถˆ๊ฐ€) 


  while s <= e :
    cnt = 0
    dist = (e+s) // 2 #๊ณต์œ ๊ธฐ๋ฅผ ์„ค์น˜ํ•˜๊ธฐ์œ„ํ•ด ๊ฐ์žฌ๋Š” ๊ฑฐ๋ฆฌ
    print('dist-------------------------------------', dist)
  
    prev_house = house[0]
    cnt += 1 #๋งจ ์ฒซ์ง‘์— ๊ณต์œ ๊ธฐ ํ•˜๋‚˜ ์„ค์น˜
    print('cnt ---', cnt)

    for i in range(1, len(house)):
      print('---------------------------i ', i)
      tmp_house = house[i]
      d = tmp_house - prev_house #๋‘ ์ง‘ ์‚ฌ์ด์˜ ๊ฑฐ๋ฆฌ
      print('tmp_house...', tmp_house, '// d...' ,d)
      
      if d >= dist :
        cnt += 1
        prev_house = tmp_house
        print('cnt ---', cnt)
      else :
        continue

    if cnt < c : #์„ค์น˜ํ•œ ๊ณต์œ ๊ธฐ๊ฐ€ ๋ชจ์ž๋ฅด๋‹ค๋ฉด(๊ฐ„๊ฒฉ์ด ๋„ˆ๋ฌด ๋„“์–ด์„œ)
      e = dist - 1 #๊ฑฐ๋ฆฌ๋ฅผ ์ค„์ด์ž
    else : #๊ณต์œ ๊ธฐ๊ฐ€ ๋”ฑ๋งž๊ฑฐ๋‚˜ or ๋„ˆ๋ฌด๋งŽ์ด ์„ค์น˜๋๋‹ค๋ฉด (๊ฐ„๊ฒฉ์ด ์ด˜์ด˜ํ•ด์„œ) 
      s = dist + 1 #๊ฑฐ๋ฆฌ๋ฅผ ๋Š˜๋ฆฌ์ž
      answer = dist
  print(answer)

๋Œ“๊ธ€