Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- Express
- dfs
- Dinosaur
- AWS
- game
- react
- flask
- 공룡게임
- OCR
- class
- cookie
- 게임
- jest
- MongoDB
- nodejs
- GIT
- Bull
- nestjs
- Sequelize
- mongoose
- Nest.js
- typeORM
- 정렬
- JavaScript
- Queue
- MySQL
- TypeScript
- Python
- 자료구조
Archives
- Today
- Total
포시코딩
[백준][이진탐색] 2110 - 공유기 설치 본문
728x90
문제
https://www.acmicpc.net/problem/2110
구현
- '공유기 간의 거리'를 줄이면 설치 가능한 '공유기 대수'가 늘어나고
거리를 늘리면 설치 가능한 '공유기 대수'가 줄어든다. - 반대로, 설치 가능한 '공유기 대수'가 적다면 거리가 너무 길다는 뜻이니
거리를 줄여 설치 가능 대수를 늘릴 수 있고
설치 가능 대수가 '크거나 같다면' 거리를 늘리면서 (최대거리를 구해야 하니)
최대 거리도 만족하며 설치 가능 대수도 x와 일치하는 값을 찾을 수 있다. (-> 목표)
코드
import sys
input = sys.stdin.readline
def solution(arr, N, C):
start = 1
end = arr[-1] - arr[0]
result = 0
while start <= end:
mid = (start + end) // 2 # 가장 인접한 두 공유기 사이의 거리 (gap)
prev = arr[0]
count = 1
for i in range(1, N): # 앞에서부터 차근차근 설치
if arr[i] >= prev + mid:
prev = arr[i]
count += 1
if count >= C: # C 개 이상의 공유기를 설치할 수 있는 경우, 거리 증가
result = mid # Upper Bound 형식 참고
start = mid + 1
else: # C 개 이상의 공유기를 설치할 수 없는 경우, 거리 감소
end = mid - 1
return result
N, C = map(int, input().split())
arr = [int(input()) for _ in range(N)]
arr.sort()
print(solution(arr, N, C))
요근래 공부하던 것 중 제일 이해하기 힘들었던 문제.
사실 아직까지 가장 인접한 두 공유기 사이의 거리를 뜻하는 gap이 왜 mid가 되는지 이해하지 못했다.
그 부분 빼고는 다행히 이해할 수 있었는데
이제 이진 탐색에 대해 막 이해하고 응용하기 시작했으니 언젠가 깨닫게 될 때가 오지 않을까 싶다.
이진 탐색 문제들은 DFS/BFS 문제와 마찬가지로 어떤 알고리즘을 써야겠다 까지는 유추하기 쉽지만
문제에 대해 어떻게 활용할지가 제일 문제가 될 것 같다.
실제로 그리디와 이진 탐색을 같이 활용해야 되는 매우 고난이도의 문제도 대회에서 출제가 된다고 하니..
다행인 것은 코테에서 이진 탐색의 출제 빈도가 그렇게 높지 않다는 것?
그래도 간만에 뇌를 좀 혹사시킬만한 문제가 나와서 그런지 즐겁게 공부했던 것 같다.
728x90
'자료구조알고리즘 > 문제풀이' 카테고리의 다른 글
[백준][구현] 10809 - 알파벳 찾기 (0) | 2023.05.08 |
---|---|
[백준][이진탐색] 2805 - 나무 자르기 (0) | 2023.04.30 |
[백준][재귀] 1074 - Z (0) | 2023.04.28 |
[백준][재귀][DP] 2747 - 피보나치 수 (0) | 2023.04.28 |
[코딩테스트] 최소 경로 합 구하기 - 작성중 (0) | 2023.04.21 |