|
| 1 | +''' |
| 2 | +
|
| 3 | +1. 아이디어 |
| 4 | + - C개의 공유기를 N개의 집에 설치해서, 가장 인접한 두 공유기 사이의 거리 중 최댓값. |
| 5 | + - 가장 인접한 두 공유기 사이의 거리를 구하기 위해 최소거리를 설정하고, 그 최소거리만큼 띄워서 공유기 설치 |
| 6 | + - 설치한 공유기가 c개 미만이면 최소거리를 낮춤, 설치한 공유기가 c개 이상이면 최소거리를 늘림.(최댓값을 찾기 위해서) |
| 7 | + - 이분탐색 알고리즘을 사용하여 '(1, 가장 오른쪽 집 - 가장 왼쪽 집)' 범위에서 최소거리 찾기 |
| 8 | +2. 시간 복잡도 |
| 9 | + - N(2<= N <= 200,000), M(2 <= M <= N) 일때, |
| 10 | + 완전탐색으로 N개의 집 중 공유기를 설치할 M개를 조합하는 시간복잡도는 O(NCM)이고 |
| 11 | + 조합한 배열에서 인접한 두 공유기 사이의 거리를 구하는 것은 O(M-1)이므로 O(NCM * (M-1))은 시간 초과. |
| 12 | + - 이분탐색은 O(N*logN)이므로 N이 200,000일때도 가능. |
| 13 | +
|
| 14 | +3. 구현 |
| 15 | +3-1. 입력받기 |
| 16 | +3-2. 배열 정렬 |
| 17 | +3-3. 이분탐색 |
| 18 | + - start, end, 를 각각 1과 arr[n-1] - arr[0]로 초기화. |
| 19 | + - 공유기를 최소거리만큼 띄워서 설치. |
| 20 | + - 설치 공유기 개수가 c보다 작으면 end를 mid로 설정. |
| 21 | + - 설치 공유기 개수가 c이상이면 start를 mid+1로 설정. |
| 22 | + - start와 end가 교차하면 종료 |
| 23 | +
|
| 24 | +''' |
| 25 | + |
| 26 | +import sys |
| 27 | + |
| 28 | +inp = sys.stdin.readline |
| 29 | + |
| 30 | + |
| 31 | +def install_router(mid): |
| 32 | + # 가장 왼쪽의 집은 무조건 설치 |
| 33 | + router_count = 1 |
| 34 | + previous_house = house[0] |
| 35 | + |
| 36 | + # 이전에 공유기를 설치했던 집 좌표 + mid <= 현재 집 좌표인지 확인 |
| 37 | + for i in range(N): |
| 38 | + if previous_house + mid <= house[i]: |
| 39 | + router_count += 1 |
| 40 | + previous_house = house[i] |
| 41 | + |
| 42 | + return router_count |
| 43 | + |
| 44 | + |
| 45 | +# 입력받기 |
| 46 | +N, C = map(int, inp().split()) |
| 47 | +house = list(map(int, [inp() for _ in range(N)])) |
| 48 | + |
| 49 | +# 정렬 |
| 50 | +house.sort() |
| 51 | + |
| 52 | +# 인접한 두 집의 가능한 최소거리와 최대거리 |
| 53 | +start = 1 |
| 54 | +end = house[N - 1] - house[0] |
| 55 | + |
| 56 | +# 정답 |
| 57 | +answer = 0 |
| 58 | + |
| 59 | +while start <= end: |
| 60 | + # 이분탐색을 위한 mid |
| 61 | + mid = (start + end) // 2 |
| 62 | + |
| 63 | + # 설치한 공유기 개수를 반환 |
| 64 | + router_count = install_router(mid) |
| 65 | + |
| 66 | + if router_count >= C: |
| 67 | + start = mid + 1 |
| 68 | + answer = mid |
| 69 | + else: |
| 70 | + end = mid - 1 |
| 71 | + |
| 72 | +print(answer) |
0 commit comments