꺼내먹는지식 준

[백준] - 이진탐색 공유기 설치 본문

코딩테스트총정리

[백준] - 이진탐색 공유기 설치

알 수 없는 사용자 2022. 9. 7. 01:39

공유기 설치

 

문제

도현이의 집 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 이 수신기 사이 최소거리로 인정받을 수 있다. 

 

간단한 문제도 오인하면 굉장히 어렵게 느껴진다는 것을 배웠다.

 

 

 

Comments