๋ฐ์ํ
๐ฑ ๋ฌธ์
๐ฑ ํ์ด
์ด ๋ฌธ์ ๋ ์ด๋ถํ์ ๋ฌธ์ ์ ๋๋ค. ์ด ๋ฌธ์ ์์๋ ์ง๋ค ์ฌ์ด์ ๊ฐ๊ฒฉ์ ์ด๋ถํ์ํ์ฌ ์กฐ์ ํฉ๋๋ค. ์๋์์ ์์ธํ ์ค๋ช ํด๋ณด๊ฒ ์ต๋๋ค.
0. ์ ๋ ฅ ๋ฐ๊ธฐ
n, c = map(int, input().split())
position = [int(input()) for _ in range(n)]
position.sort()
- ์ง์ ๊ฐ์
n
๊ณผ ๊ณต์ ๊ธฐ ๊ฐ์c
๋ฅผ ์ ๋ ฅ ๋ฐ์ต๋๋ค. - ์ง์ ์์น๋ฅผ ๋ฆฌ์คํธ(
position
)์ ์ ๋ ฅ๋ฐ์ต๋๋ค. - ์ด๋ถ ํ์์ ์ํด์ ์ง์ ์์น๋ฅผ ์ ๋ ฌํฉ๋๋ค.
1. ๋ณ์ ์ด๊ธฐํ
result = 0
start,end = 1, position[n-1] - position[0]
- ๋ฌธ์ ์ ์ ๋ต์ธ ๊ณต์ ๊ธฐ์ ์ต๋ ๊ฐ๊ฒฉ์ ์ ์ฅํ๋
result
๋ณ์๋ฅผ ์์ฑํฉ๋๋ค. - ์ด๋ถ ํ์์ ์ํ
start
์end
๋ฅผ ์์ฑํฉ๋๋ค. ์ด๋, ๊ฐ๊ฒฉ์ ์ด๋ถํ์ํ์ฌ ์กฐ์ ํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์start
์ ์ด๊ธฐ๊ฐ์ ๊ฐ๊ฒฉ์ ์ต์๊ฐ์ธ 1์ด๊ณ ,end
์ ์ด๊ธฐ๊ฐ์ ๊ฐ๊ฒฉ์ ์ต๋๊ฐ์ธposition[n - 1] - position[0]
์ ๋๋ค.
2. ์ด๋ถ ํ์
while(start < end):
mid = (start + end)//2
# ์ฒซ๋ฒ์งธ ์ง์๋ ๋ฌด์กฐ๊ฑด ์ค์น
count = 1
installed = position[0]
for i in range(n):
if position[i] - installed >= mid:
count += 1
installed = position[i] # ๊ณต์ ๊ธฐ ์ค์น
if count >= c:
result = mid
start = mid + 1 # ๊ฐ๊ฒฉ ๋๋ฆฌ๊ธฐ
elif count < c:
end = mid # ๊ฐ๊ฒฉ ์ค์ด๊ธฐ
- ์ค๊ฐ๊ฐ(
mid
)๋(start + end) // 2
์ ๋๋ค. ์ฆ, ๊ฐ๊ฒฉ์ ์ค๊ฐ๊ฐ์ ๋๋ค. (start
๊ฐ ๊ฐ๊ฒฉ์ ์ต์๊ฐ,end
๊ฐ ๊ฐ๊ฒฉ์ ์ต๋๊ฐ) - ๊ณต์ ๊ธฐ๋ฅผ ์ต๋ํ ๋์ฐ๋์ฐํ๊ฒ ์ค์นํ๊ธฐ ์ํด์๋ ์ฒซ๋ฒ์งธ ์ง์๋ ๋ฌด์กฐ๊ฑด ์ค์น๋์ด์ผ ํฉ๋๋ค. (๋จ, ๋ง์ง๋ง ์ง์๋ ๋ฌด์กฐ๊ฑด ์ค์นํ์ง ์์ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ while ๋ฃน์ผ๋ก ๋ค์ด๊ฐ๋ฉด ๊ณต์ ๊ธฐ ์ค์น ๊ฐ์๋ฅผ ์๋
count
๋ณ์๋ฅผ ๋ฌด์กฐ๊ฑด 1๋ก ์ค์ ํ๊ณposition[0]
์ ๊ณต์ ๊ธฐ ์ค์น ์์น๋ฅผ ์ ์ฅํ๋installed
๋ณ์์ ํ ๋นํฉ๋๋ค. - ๊ทธ๋ฆฌ๊ณ ๋์, ์ ์ฒด
position
์ ๋๋ฉด์ ํ์ฌ ์ค์ ๋mid
๊ฐ๋ณด๋ค ๊ฐ๊ฒฉ์ด ๋๊ฑฐ๋ ๊ฐ์ ์์น์ ๊ณต์ ๊ธฐ๋ฅผ ์ค์นํฉ๋๋ค.- ๊ณต์ ๊ธฐ๋ฅผ ์ค์นํ์ผ๋ฉด
count
๊ฐ์ 1 ์ฆ๊ฐ์ํค๊ณinstalled
๋ ์ค์นํ ๊ณต์ ๊ธฐ์ ์์น๋ก ๊ฐฑ์ ์ํต๋๋ค.
- ๊ณต์ ๊ธฐ๋ฅผ ์ค์นํ์ผ๋ฉด
- for ๋ฃจํ๋ฅผ ๋ชจ๋ ๋๊ณ ๋๋ฉด ํ์ฌ ์ค์ ํ
mid
๊ฐ๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ์ ๊ฐ๊ฒฉ์ ๋๊ณ ์ค์นํ ์ ์๋ ๊ณต์ ๊ธฐ๋ฅผ ๋ชจ๋ ์ค์นํ๋ค๋ ์๋ฏธ์ ๋๋ค.- ์ค์นํ ๊ณต์ ๊ธฐ ๊ฐ์(
count
)๊ฐ ์ค์นํด์ผ ํ๋ ๊ณต์ ๊ธฐ ๊ฐ์(c
)๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ๋ค๋ฉด ํ์ฌmid
๊ฐ ์ ๋ต์ด ๋ ์ ์์ผ๋ฏ๋กresult
์mid
๊ฐ์ ์ ์ฅํ๊ณ , ๊ฐ๊ฒฉ์ ๋ ์ค์ผ ์ ์๋ ์ง ํ์ธํ๊ธฐ ์ํดstart
๋ฅผmid + 1
๋ก ์ ๋ฐ์ดํธํฉ๋๋ค. - ์ค์นํ ๊ณต์ ๊ธฐ ๊ฐ์(
count
)๊ฐ ์ค์นํด์ผ ํ๋ ๊ณต์ ๊ธฐ ๊ฐ์(c
)๋ณด๋ค ์๋ค๋ฉด ๊ณต์ ๊ธฐ๋ฅผ ๋ชจ๋ ์ค์นํ์ง ๋ชปํ๋ค๋ ์๋ฏธ์ด๋ฏ๋ก ๊ฐ๊ฒฉ์ ์ค์ฌ์ฃผ์ด์ผ ํฉ๋๋ค.end
๋ฅผmid
๋ก ์ ๋ฐ์ดํธํฉ๋๋ค.
- ์ค์นํ ๊ณต์ ๊ธฐ ๊ฐ์(
๐ฑ ์ฝ๋
# usr/bin/env python
# -*- coding: utf8 -*-
# boj 2110 ๊ณต์ ๊ธฐ ์ค์น
import sys
input = sys.stdin.readline
n, c = map(int, input().split())
position = [int(input()) for _ in range(n)]
position.sort()
start,end = 1, position[n-1] - position[0]
result = 0
if c == 2:
print(position[n - 1] - position[0])
else:
while(start < end):
mid = (start + end)//2
# ์ฒซ๋ฒ์งธ ์ง์๋ ๋ฌด์กฐ๊ฑด ์ค์น
count = 1
installed = position[0]
for i in range(n):
if position[i] - installed >= mid:
count += 1
installed = position[i] # ๊ณต์ ๊ธฐ ์ค์น
if count >= c:
result = mid
start = mid + 1 # ๊ฐ๊ฒฉ ๋๋ฆฌ๊ธฐ
elif count < c:
end = mid # ๊ฐ๊ฒฉ ์ค์ด๊ธฐ
print(result)
๋ฐ์ํ
'Algorithm > BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ] #1027 ๊ณ ์ธต ๊ฑด๋ฌผ(Bruteforce, Python) (0) | 2023.02.28 |
---|---|
[BOJ] #1450 ๋ ์๋ฌธ์ (์ด๋ถ ํ์, Python) (0) | 2023.02.27 |
[BOJ] #2252 ์ค ์ธ์ฐ๊ธฐ (Python) (0) | 2023.02.22 |
[BOJ] #1976 ์ฌํ๊ฐ์(Python) (0) | 2023.02.21 |
[BOJ] #13144 List of Unique Numbers (Python) (0) | 2023.02.21 |
๋๊ธ