diff --git "a/BOJ/\352\263\265\354\234\240\352\270\260 \354\204\244\354\271\230/sumin.py" "b/BOJ/\352\263\265\354\234\240\352\270\260 \354\204\244\354\271\230/sumin.py" new file mode 100644 index 00000000..56bd3f33 --- /dev/null +++ "b/BOJ/\352\263\265\354\234\240\352\270\260 \354\204\244\354\271\230/sumin.py" @@ -0,0 +1,51 @@ +""" +풀이시간: 25분 + + +n: 집의 개수(2 ≤ N ≤ 200,000) +c: 공유기의 개수(2 ≤ C ≤ N) +집의 좌표 xi (0 ≤ xi ≤ 1,000,000,000)가 주어짐 + + +1. 가장 인접한 두 공유기 사이의 거리를 이분탐색한다. +2. 가장 인접한 집 간의 거리를 유지하면서 최대한 많은 공유기를 설치했을 때, C개 이상 설치할 수 있으면 정답의 후보가 된다. +- 가능한 경우면, 거리를 더 크게 -> 더 적은 공유기 설치 가능 +- 불가능한 경우면, 거리를 더 작게 -> 더 많은 공유기 설치 가능 + +<시간복잡도> +O(nlogn) +""" +import sys +input = sys.stdin.readline + +# 집, 공유기의 개수 +n, c = map(int, input().split()) +# 집 좌표 +homes = [int(input()) for _ in range(n)] +homes.sort() # 가장 인접한 집을 확인하기 위해 정렬 + + +def possible(diff: int) -> bool: + """ + diff: 가장 인접한 두 공유기 사이의 거리 + """ + cnt = 1 # 첫 번째 집부터 설치 + last = homes[0] + for home in homes: # 인접한 집들 확인 + if home - last >= diff: # 가장 인접한 두 공유기 사이의 거리가 diff 이상이면 + cnt += 1 # 공유기 설치 개수 업데이트 + last = home # 현재 집 좌표로 갱신 + return cnt >= c # 최대한 많은 공유기를 설치했을 때의 개수가 c개 이상이라면 true + +ans = 1 +left = 1 +right = homes[-1] - homes[0] # 가능한 가장 먼 거리 + +while left <= right: + mid = (left+right) // 2 # 가장 인접한 두 공유기 사이의 거리를 이분탐색 + if possible(mid): # c개의 공유기가 설치 가능하다면 ans 값 업데이트 + ans = mid + left = mid + 1 + else: # 설치가 불가능하면 오른쪽 포인터를 이동시켜 인접한 두 공유기 사이의 거리를 줄이고 다시 탐색 + right = mid - 1 +print(ans) \ No newline at end of file