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
접근법
- mid(공유기간 거리)값을 늘리면서 mid로 했을 때의 공유기의 개수가 count(설치 가능한 공유기 수)와 비교함
- count가 더 크다면 공유기를 더 설치 할 수 있으므로 mid를 줄임
- count가 더 작다면 공유기 개수를 줄여야 하므로 mid를 키움
def init_func(N):
arr = []
for i in range(N):
arr.append(int(input()))
arr.sort()
return arr
def solution(arr, c):
start = 1
end = arr[-1] - arr[0]
ans = 0
while start <= end:
mid = (end + start) // 2
cur = arr[0] # 첫 집집에 공유기 두기
count = 1
# 현재 mid값의 거리로 공유기 뒀을 때의 공유기 개수
for i in range(1, len(arr)):
if arr[i] >= cur + mid:
count += 1
cur = arr[i]
# 공유기 개수 확인
if count >= c:
ans = mid
start = mid + 1
else:
end = mid - 1
print(ans)
def main():
N, C = map(int, input().split())
arr = init_func(N)
solution(arr, C)
if __name__=="__main__":
main()
사용된 알고리즘
이분탐색, 매개 변수 탐색
728x90
'study > 백준(BOJ)' 카테고리의 다른 글
[Python] 17626. Four Squares (0) | 2023.05.12 |
---|---|
[Python] 16234. 인구 이동 (0) | 2023.04.29 |
[Python] 7795. 먹을 것인가 먹힐 것인가 (0) | 2023.04.27 |
[Python] 27211. 도넛 행성 (0) | 2023.04.25 |
[Python] 23351. 물 주기 (0) | 2023.04.25 |