꺼내먹는지식 준
[백준] - 이진탐색 공유기 설치 본문
공유기 설치
문제
도현이의 집 N개가 수직선 위에 있다. 각각의 집의 좌표는 x1, ..., xN이고, 집 여러개가 같은 좌표를 가지는 일은 없다.
도현이는 언제 어디서나 와이파이를 즐기기 위해서 집에 공유기 C개를 설치하려고 한다. 최대한 많은 곳에서 와이파이를 사용하려고 하기 때문에, 한 집에는 공유기를 하나만 설치할 수 있고, 가장 인접한 두 공유기 사이의 거리를 가능한 크게 하여 설치하려고 한다.
C개의 공유기를 N개의 집에 적당히 설치해서, 가장 인접한 두 공유기 사이의 거리를 최대로 하는 프로그램을 작성하시오.
입력
첫째 줄에 집의 개수 N (2 ≤ N ≤ 200,000)과 공유기의 개수 C (2 ≤ C ≤ N)이 하나 이상의 빈 칸을 사이에 두고 주어진다. 둘째 줄부터 N개의 줄에는 집의 좌표를 나타내는 xi (0 ≤ xi ≤ 1,000,000,000)가 한 줄에 하나씩 주어진다.
출력
첫째 줄에 가장 인접한 두 공유기 사이의 최대 거리를 출력한다.
첫째 줄에 가장 인접한 두 공유기 사이의 최대 거리를 출력한다.
예제 입력 1 복사
5 3
1
2
8
4
9
예제 출력 1 복사
3
힌트
공유기를 1, 4, 8 또는 1, 4, 9에 설치하면 가장 인접한 두 공유기 사이의 거리는 3이고, 이 거리보다 크게 공유기를 3개 설치할 수 없다.
좀처럼 잘 이해가 가지 않았으나 아래 블로그 글을 참고하고 이해를 할 수 있었다.
https://my-coding-notes.tistory.com/119
[🥈1 / 백준 2110 / 파이썬] 공유기 설치
2110번: 공유기 설치 첫째 줄에 집의 개수 N (2 ≤ N ≤ 200,000)과 공유기의 개수 C (2 ≤ C ≤ N)이 하나 이상의 빈 칸을 사이에 두고 주어진다. 둘째 줄부터 N개의 줄에는 집의 좌표를 나타내는 xi (0 ≤
my-coding-notes.tistory.com
전에 유사한 문제를 풀이한 적 있었는데, 그때의 풀이는 완전히 잊어버리고 한참 고민을 했다.
결론적으로 정리하자면 공유기를 C개 설치하고자 하는데, 이 중 인접한 두 공유기 사이의 거리를 최대로 하는 경우를 찾아야 한다.
우리의 머리는 이를 아래와 같은 알고리즘으로 풀이한다.
1) 최초 포인트(1)을 잡는다.
2) C 개에 맞춰 얼추 어느정도 거리를 최초점(직전점)으로부터 띄어서 잡는다.
3) 2번 반복
즉 최초포인트로부터 일정 크기 만큼 떨어지기 잡은 포인트들이 총 C개인지 그리고 적절하게 떨어졌는지가 문제해결의 포인트다.
두 점 사이의 거리를 조정하며 포인트가 총 C 개가 될 수 있는 상황 중, 인접한 두 공유기 사이의 거리인 최소 거리를 최대로 하는 경우를 찾아야 한다.
import sys
input = sys.stdin.readline
N, C = map(int,input().split())
cord = [0] * N
for i in range(N):
cord[i] = int(input())
cord.sort()
print(cord)
start, end = 1, cord[-1] - cord[0]
if C == 2:
print(cord[-1] - cord[0])
exit()
while (start <= end):
mid = (start + end) // 2
tmp = cord[0]
cnt = 1
for i in range(1, N):
if tmp + mid <= cord[i]:
cnt += 1
tmp = cord[i]
if cnt >= C:
result = mid
start = mid + 1
else:
end = mid - 1
print(result)
해당 문제 풀이에서는 중요하게 고려해야 하는 부분이 있다.어쩌면 당연하게 받아들여야 하는 부분인데 내가 받아들이지 못하는 것일 수도 있다. 다만, 나와 같이 오인한 경우에는 해당 문제를 풀 수 없기에 글을 남긴다.
집에 공유기 C개를 설치하려고 한다. 최대한 많은 곳에서 와이파이를 사용하려고 하기 때문에, 한 집에는 공유기를 하나만 설치할 수 있고, 가장 인접한 두 공유기 사이의 거리를 가능한 크게 하여 설치하려고 한다.
C개의 공유기를 N개의 집에 적당히 설치해서, 가장 인접한 두 공유기 사이의 거리를 최대로 하는 프로그램을 작성하시오.
한 집에 공유기를 하나만 설치할 수 있다는 내용을 적기 위해 최대한 많은 곳에서 와이파이를 사용하려고 한다는 문제이다.
하지만, 문제를 오인하여 최대한 많은 곳, 즉 최대한 많은 좌표에서 와이파이를 사용할 수 있어야 한다고 오인했다.
문제를 해결할 때 사용하는 gap 은 인터넷 수신 거리가 아니다. 애초에 인터넷 수신 거리는 아예 제공된 정보가 아니다.
하지만 gap 을 인터넷 수신 거리로 오인해서 문제를 해결하려고 하니 접근이 어려웠다.
이 전 + gap <= 이후 는 최소한으로 되어야 gap 이 수신기 사이 최소거리로 인정받을 수 있다.
간단한 문제도 오인하면 굉장히 어렵게 느껴진다는 것을 배웠다.
'코딩테스트총정리' 카테고리의 다른 글
[백준] - 다이나믹 프로그래밍 병사 배치하기, 가장 긴 증가하는 부분 수열 2 (0) | 2022.09.12 |
---|---|
[백준] - 다이나믹프로그래밍 정수 삼각형 (0) | 2022.09.09 |
[백준] - DFS 연산자 끼워넣기 (0) | 2022.09.01 |
[백준] - BFS 특정 거리의 도시 찾기 (0) | 2022.08.26 |
백준 - 구현 뱀 (0) | 2022.08.26 |