Skip to content

Commit bf3774b

Browse files
committed
[BOJ] 공유기 설치 / 골드 4 / 실패
https://www.acmicpc.net/problem/2110
1 parent b8435c2 commit bf3774b

File tree

1 file changed

+72
-0
lines changed

1 file changed

+72
-0
lines changed
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
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

Comments
 (0)