공유기 설치
문제 설명
도현이의 집 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 |
나의 풀이
import sys
def binary_search(house, target, start, end):
ans = 0
# 이진 탐색 시작
while start <= end:
mid = (start + end) // 2 # 중간값 설정(공유기 사이 거리)
# 첫번째 좌표부터 보며 공유기 간 거리가 mid일 때 공유기의 개수를 구함
cnt = 1 # 공유기의 개수
last = house[0]
for h in house:
if h - last >= mid:
cnt += 1
last = h
if cnt >= target:
start = mid + 1
ans = max(ans, mid)
else:
end = mid - 1
return ans
n, c = map(int, sys.stdin.readline().split())
house = [int(sys.stdin.readline()) for _ in range(n)]
house.sort()
print(binary_search(house, c, 1, house[n-1]-house[0]))
- 💡 아이디어
이진탐색으로 공유기 간 거리를 조절하며 그 때의 공유기의 개수가 c인지 찾도록 하였다.
[1, 2, 4, 8, 9]라면 공유기 간 거리는 1 ~ 8이 될 수 있다.
- 📚 후기
도저히 방법이 생각나지 않아 아이디어만 찾아보았다. 아이디어를 본 후 작성한 코드는 답과 거의 동일하다.
- ✏️ 배운점
- arr[len(arr)-1]로 쓰던 걸 arr[-1]로 바꿔 쓰자.
- 방법이 생각나지 않을 때는 원하는 값(결과값)을 조절하며 이진탐색하는 방법을 생각해보자.
'Programming > Questions' 카테고리의 다른 글
[백준/Python] 덱 - AC(5430) (0) | 2021.08.14 |
---|---|
[백준/Python] 해시 - 임진왜란(3077) (0) | 2021.08.09 |
[백준/Python] 해시 - I AM IRONMAN(17264) (0) | 2021.08.09 |
[백준/Python] 해시 - 나는야 포켓몬 마스터 이다솜(1620) (0) | 2021.07.19 |
[프로그래머스/Python] 해시 - 전화번호 목록 (0) | 2021.07.14 |