[BOJ] 백준 2110번 공유기 설치(Python)

deannn.Park·2021년 7월 2일
0

BOJ - 백준

목록 보기
11/42
post-thumbnail

문제

도현이의 집 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

출력

3

풀이

N, C = map(int, input().split())		# 집, 공유기
houses = list(int(input()) for _ in range(N))	# 집 좌표
houses.sort()					# 정렬

lt = 1						# 집 사이의 최소 거리
rt = houses[-1] - houses[0]			# 집 사이의 최대거리(양 끝 집 거리)
rst = rt					# 결과값. 최대값으로 초기화

while lt <= rt:					# 이분탐색
    mid = (rt + lt) // 2
    cnt = 1					# 집들 사이 최소거리가 mid일 때의 공유기 개수 초기화
    start = houses[0]				# 집 사이의 거리를 재기 위한 출발 집 좌표.
    
    for i in range(1, N):			# 공유기 개수 셈
        distance = houses[i] - start		# 집 사이의 거리
        if mid <= distance:			# 집 사이의 거리가 mid 이상이면 다음 공유기 설치
            cnt += 1
            start = houses[i]			# 다음 집과의 거리를 구하기 위한 집 좌표 변경

    if cnt < C:					# 설치한 공유기 개수가 C 미만이면 거리를 줄임
        rt = mid - 1
    else:					# 설치한 공유기 개수가 C 이상이면 거리를 늘림
        rst = mid				# 결과값 저장
        lt = mid + 1

print(rst)

이분탐색 문제이다. 기준을 가장 인접한 공유기 사이의 거리(distance)로 잡고, 이분탐색을 한 번 할 때 마다 이 길이로 공유기를 설치하면 공유기의 개수가 C가 되는지 확인한다.
공유기의 개수가 C가 된다면 distance가 최대가 되도록 이분탐색을 계속 진행한다.

profile
컴퓨터 관련 여러 분야 공부중

0개의 댓글