본문 바로가기

알고리즘

파이썬) 공유기 설치 - BOJ

https://www.acmicpc.net/problem/2110

 

 

n, c = map(int, input().split())

arr = []

for i in range(n):
    arr.append(int(input()))

arr.sort()

start = 1
end = arr[-1] - arr[0]
#최대거리

answer = 0

while start <= end:
    mid = (start + end) // 2
    #거리 설정
    cnt = 1
    #첫번재 집은 무조건 설치
    last = arr[0]
    #마지막으로 설치된 집의 위치

    for i in range(1, len(arr)):
        if arr[i] >= last + mid:
            #거리가 mid만큼 떨어져잇다면
            cnt += 1
            last = arr[i]

    if cnt >= c:
        #설치한게 주어진 조건보다 작거나 같으면
        #거리를 더 줄여도 됨
        start = mid + 1
        answer = mid
    else:
        #반대라면 거리를 좀 늘려야 됨
        end = mid - 1

print(answer)

이 문제는 무엇을 mid로 둘지, 그리고 어떤 경우에 start와 end를 건드릴지 고민이 되었다.

우선 mid는 거리로 두기로 결정했따.

만약 거리가 4라면 공유기 설치는 다음과 같다

1 2 3 4 5 6 7 8 9

위에서 설치 가능한 집은 1,2,4,8,9가 되고

거리를 4만큼 떨어져 있어야한다는 조건 아래에 공유기를 설치한다면

 

1, 8이 된다.

거리가 4일때 공유기는 두 개밖에 설치하지 못한다.

공유기가 부족하다 => 더 설치해야한다 => 거리를 좀 더 좁히자

거리가 3일때 생각해보자.

설치가능한 집은

1,4,8

또는 1,4,9가 된다.

공유기 설치의 거리가 3이라면 3개가 충분히 가능하다.

그럼 마찬가지로 거리가 2일때도 그보다 큰 3이 가능했으니 당연히 거리 2또한 가능하다.

즉, 거리가 3보다 작거나 같다면 공유기 설치가 가능하다는 뜻이다.

'알고리즘' 카테고리의 다른 글

파이썬) 회전초밥 - BOJ  (0) 2023.11.20
파이썬) 비슷한 단어 - BOJ  (0) 2023.11.19
파이썬)체스판 위의 공 - BOJ(실패)  (0) 2023.11.12
파이선) 개똥벌레 - BOJ  (0) 2023.11.12
파이썬) 2048(Easy) - BOJ  (0) 2023.11.11