백준 2110 문제 / 책 369p
적당한 수를 이진탐색을 찾는 떡 자르기 문제의 parametic search 가 생각났다.
아마 맞지 않을까?
'적당한' 의 기준은 아마 '가장 인접한 두 공유기 사이의 거리를 최대로' 일 것이다.
집들이 일직선 상에 위치하고 있으니, 뺄셈후 절댓값 씌운 것을 거리로 활용할 것.
그런데 공유기가 2개가 아니라, C개이면,, , 걍 손으로 생각하는게 빠를듯
이렇게 짝-홀 기준으로 나눠서 생각하면 안될까요
파라매트릭 서치 유형
- 이진탐색으로 '가장 인접한 두 공유기 사이 거리'를 조절해가며, 매 순간 실제로 공유기를 설치하여 C보다 많은 갯수로 공유기를 설치할 수 있는지 체크하여 문제 해결
- '가장 인접한 두 공유기 사이의 거리'의 최댓값을 찾아야하므로, C보다 많은 갯수로 공유기를 설치할 수 있다면, '가장 인접한 두 공유기 사이의 거리'의 값을 증가시켜서, 더 큰 값에 대해서도 성립하는지 체크하기 위해 다시 탐색을 수행한다.
예시)
5개의 집의 좌표는 [1,2,4,8,9] 이고 공유기의 최소갯수 C=3
# 집의 갯수 N, 공유기의 최소 갯수 C 입력받기
n, c = list(map(int, input().split(' ')))
# 전체 집의 좌표 정보를 입력받기
array = []
for _ in range (n) :
array.append(int(input()))
array.sort() # 이진탐색 수행을 위해 정렬 수행
start = array[1] - array[0] # 집의 좌표중에 가장 작은 값
end = array[-1] - array[0] # 집의 좌표중에 가장 큰 값
result = 0
while (start <= end) :
mid = (start+end) // 2 # mid는 가장 인접한 공유기사이의 거리(gap)를 의미
value = array[0]
count = 1
# 현재의 mid값을 이용해 공유기를 설치
for i in range(1, n) # 앞에서부터 차근차근 설치
if array[i] >= value + mid :
value = array[i]
count += 1
if count >= c : #C개 이상의 공유기를 설치할 수 있는 경우, 거리를 증가
start = mid + 1
result = mid #최적의 결과를 저장
else : #C개 이상의 공유기를 설치할 수 없는 경우, 거리를 감소
end = mid - 1
print(result)
먼가,, 아직 잘 이해가 안된다.
[ ] 손으로 다시그리기
[ ] 다시 치기