알고리즘
[python3] 백준 2110 풀이 ( 공유기 설치, 이분탐색 )
https://github.com/Dev-Guccin
2021. 8. 24. 13:14
저번에 푼 프로그래머스와 비슷한 문제였다. 그런데 상당히 헤매고 풀었기 때문에 다시 한번 풀이를 정리해 본다.
[python3] 프로그래머스 징검다리 풀이 ( 이분탐색 )
왜 이분 탐색문제인지 이해를 할수가 없어서 상당히 헤맸다. 결국 풀이를 봤다. 우선 문제를 읽어보면, 징검다리를 만들 때 n만큼 돌을 제거하고 최솟값을 찾는다. 이때 최솟값을 최대로 만드는
guccin.tistory.com
우선 문제를 읽어보자
문제를 읽어보면 입력으로 x가 0~1,000,000,000의 범위를 가진다. 딱 보자마자 완전 탐색으로는 절대 돌수가 없다. 따라서 이분탐색의 냄새가 난다.
x의 좌표에서 이분탐색의 느낌이 나는데, 우리는 출력으로 두 공유기 사이의 최대 거리를 출력해야한다. 공유기 사이의 최대거리를 만족하기 위해서는 2가지가 필요하다.
1. 최대값 x가 존재할때 x보다 긴 거리에 공유기 설치
2. 집에서 C만큼 공유기 설치
=> 말이 이상하긴 한데, 결국 공유기의 개수와 최대거리를 만족해야한다. 그럼 최대거리를 이분탐색으로 놓고 공유기를 만족하는지 연산을 진행하면 쉽게 구할 수 있다.
N,C = map(int, input().split())
house = []
for _ in range(N):
house.append(int(input()))
house.sort()
L=1
R=house[-1]//2
H=0
while L<=R:
M = (L+R)//2
install = 1
install_list = [house[0]]
for i in range(1,N):
if (house[i] - install_list[-1] >= M):
install_list.append(house[i])
install += 1
if install >= C:
H = M
L = M+1
else:
R = M-1
print(H)