백준 2110번 공유기 설치
백준 2110번 공유기 설치
이분 탐색은 정렬된 숫자중에서 특정값을 찾는것인데 이문제에 어떻게 접목시켜야하는지 고민했다
가장 인접한 두 공유기 사이 거리를 크게 설치한다 -> 공유기 사이거리를 최대한 떨어져서 설치해야한다
위 문제를 통해 해결해야될 것은 2가지로 생각된다
- 집마다 거리가 각각 다르다
- 공유기를 어떤 방법으로 설치할것인가
해결방법
처음 위치를 1로 초기화하고 그에 맞는 집의 위치를 설정한다 최대는 마지막집 - 처음집 + 1이 된다
이분 탐색을 이용하여 간격을 조절한다 -> (처음 집 위치 + 마지막집 위치)//2 를 통해서 mid값을 구하고 만약 mid값을 기준으로 공유기를 설치 했을때 조건에 충족 되는지 확인하고 조건에 충족되면 출력한다
조건은 mid 간격이상으로 설치했을때 입력받은 공유기 개수보다 더 크게 설치되면 start = mid +1 간격을 늘이고 더 작게 설치되면 공유기 설치 간격을 줄인다 end = mid -1이걸 반복해서 조건에 만족하는 값을 출력한다
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import sys
N,C = map(int,sys.stdin.readline().split())
distance = []
distance_list = []
for i in range(0,N):
distance.append(int(sys.stdin.readline()))
distance.sort()
start = 1
end = distance[-1] - distance[0] #최대거리
while start <= end:
c = 1 #처음 집에 공유기 설치가 되므로 1로 시작한다
k = 0 #마지막으로 공유기가 설치된 위치
mid = (start + end)//2
for i in range(1,N): #거리를 이분 탐색한다
if distance[i] >= distance[k] + mid:
c += 1 #공유기 설치개수
k = i
if c >= C:
start = mid + 1
distance_list.append(mid)
else:
end = mid - 1
print(max(distance_list))
This post is licensed under CC BY 4.0 by the author.