도현이의 집 N개가 수직선 위에 있다. 각각의 집의 좌표는 x1, ..., xN이고, 집 여러개가 같은 좌표를 가지는 일은 없다.
도현이는 언제 어디서나 와이파이를 즐기기 위해서 집에 공유기 C개를 설치하려고 한다. 최대한 많은 곳에서 와이파이를 사용하려고 하기 때문에, 한 집에는 공유기를 하나만 설치할 수 있고, 가장 인접한 두 공유기 사이의 거리를 가능한 크게 하여 설치하려고 한다.
C개의 공유기를 N개의 집에 적당히 설치해서, 가장 인접한 두 공유기 사이의 거리를 최대로 하는 프로그램을 작성하시오.
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
import sys
N,C=map(int,sys.stdin.readline().split())
house=[]
for _ in range(N):
house.append(int(sys.stdin.readline()))
house.sort()
def bin_router(min,max):
counter=1
old=house[0]
mid=(min+max)//2
if(min>max):
print(mid)
return
for x in range(1,len(house)):
if(old+mid<=house[x]):
counter+=1
old=house[x]
if(counter>=C):
return bin_router(mid+1,max)
else:
return bin_router(min,mid-1)
bin_router(1,house[-1]-house[0])
※ 이분 탐색
● 가장 인접한 두 공유기 사이의 가능한 최소 거리는 1, 최대 거리는 맨 처음 집과 맨 끝 집 사이의 거리이다. 처음에 이 두 거리를 함수에 매개변수로 넘겨준다.
● 매개변수로 넘어온 두 거리의 평균값 mid를 가장 인접한 두 공유기 사이의 거리라고 가정한다. 각 집에서 다음 집까지의 거리가 mid보다 크거나 같아야지만 mid가 가장 인접한 두 공유기 사이의 거리가 된다. 이 조건을 만족하는 집들의 총 개수가 C보다 크거나 같으면 가장 인접한 두 공유기 사이 거리가 더 커도 이를 만족하는 집들의 총 개수가 C가 될 수 있고, C보다 작으면 가장 인접한 두 공유기 사이 거리가 더 작아야만 이를 만족하는 집들의 개수가 C가 될 수 있다.
● 이에 알맞게 재귀함수를 호출하고, 첫번째 매개변수가 두번째 매개변수보다 큰 함수가 호출되면 mid 값을 출력해준다.
'백준(baekjoon) > 골드' 카테고리의 다른 글
백준(baekjoon) 2293번: 동전 1(골드 5, 파이썬 PYTHON) - 동적 계획법 2 (0) | 2023.01.30 |
---|---|
백준(baekjoon) 7576번: 토마토(골드 5, 파이썬 PYTHON) - 그래프와 순회 (0) | 2023.01.28 |
백준(baekjoon) 10986번: 나머지 합(골드 3, 파이썬 PYTHON) - 누적 합 (0) | 2022.11.15 |
백준(baekjoon) 12865번: 평범한 배낭(골드 5, 파이썬 PYTHON) - 동적 계획법 1 (0) | 2022.10.08 |
백준(baekjoon) 9251번: LCS(골드 5, 파이썬 PYTHON) - 동적 계획법 1 (0) | 2022.10.06 |