-문제: https://www.acmicpc.net/problem/2110
2110번: 공유기 설치
첫째 줄에 집의 개수 N (2 ≤ N ≤ 200,000)과 공유기의 개수 C (2 ≤ C ≤ N)이 하나 이상의 빈 칸을 사이에 두고 주어진다. 둘째 줄부터 N개의 줄에는 집의 좌표를 나타내는 xi (0 ≤ xi ≤ 1,000,000,000)가
www.acmicpc.net
처음보는 유형의 문제라 어떻게 풀어야할지 몰랐던 문제다. 파라메트릭 서치 유형. 이것도 찾아봐야겠다
아직 설명이 다 이해가지 않지만 이해한 부분만 정리해 보자면
기본 값이 크기때문에 시간초과를 피하기 위해 이진탐색을 한다
여기서 start,end,mid 값은 집 위치들의 차이(gap)을 의미한다.
start=min gap
end= max gap
이후 gap보다 큰 위치이 있는 집에 공유기를 설치하고, 공유기 수를 증가 시킨다.
이때의 값이 원래 가지고 있는 공유기의 갯수(c)와 비교했을 때
c보다 작으면 설치한 공유기 수가 적은 것이고, 이는 gap이 너무 넓기때문에 발생하므로 gap을 줄여야 한다(end=mid-1)
c가 같거나 작으면 설치한 공유기의 수가 같거나 많은 것이고, 이때 원래의 gap을 저장하고(result=mid) gap의 값을 증가했을 때도 성립하는지 확인한다(이부분이 제일 이해가 가지 않는다)
-정답풀이:
n,c=map(int,input().split())
data=[]
for _ in range(n):
data.append(int(input()))
data.sort()
start=1
end=data[-1]-data[0]
result=0
while(start<= end):
mid=(start+end)//2
value=data[0] #공유기 설치하는 집 위치
count=1 #공유기 갯수
for i in range(1,n):
if data[i]>=value+mid:
value=data[i]
count+=1
if count >= c: #거리가 짧음 늘려야한다
start=mid+1
result=mid
else: #거리가 길어서 줄여야한다
end=mid-1
print(result)
'백준 > Search' 카테고리의 다른 글
[dfs/백준] 2667번: 단지번호 붙이기 (0) | 2022.07.19 |
---|---|
[그리디/백준] 11051번 : 주식 (0) | 2022.07.16 |
[zoho 인터뷰/이진탐색] 정렬된 배열에서 특정 수의 개수 구하기 (0) | 2022.05.12 |
[백준/bfs] 18428번: 감시 피하기 (0) | 2022.05.08 |
[dfs/백준] 14888번: 연산자 끼워넣기 (0) | 2022.05.08 |