Post

백준 2110번 공유기 설치

이분 탐색은 정렬된 숫자중에서 특정값을 찾는것인데 이문제에 어떻게 접목시켜야하는지 고민했다

백준 2110번 공유기 설치

이분 탐색은 정렬된 숫자중에서 특정값을 찾는것인데 이문제에 어떻게 접목시켜야하는지 고민했다

가장 인접한 두 공유기 사이 거리를 크게 설치한다 -> 공유기 사이거리를 최대한 떨어져서 설치해야한다

위 문제를 통해 해결해야될 것은 2가지로 생각된다

  1. 집마다 거리가 각각 다르다
  2. 공유기를 어떤 방법으로 설치할것인가

 

 

해결방법

  1. 처음 위치를 1로 초기화하고 그에 맞는 집의 위치를 설정한다 최대는 마지막집 - 처음집 + 1이 된다

  2. 이분 탐색을 이용하여 간격을 조절한다 -> (처음 집 위치 + 마지막집 위치)//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.