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
- 스택과 힙
- 해시
- HTTP
- post
- 파이썬 알고리즘
- 프로그래머스
- 지도학습
- 강화학습
- 코딩
- BOJ
- 너비우선탐색
- rest api
- 딥러닝
- 캐싱
- 오버라이딩
- bineary search
- 백준
- 깊이우선탐색
- 코테
- 알고리즘
- 파이썬
- Merge sort
- 코딩테스트
- 비지도학습
- 자바
- 파이썬 오류
- 머신러닝
- 딕셔너리
- 이진탐색
- 멱등
Archives
- Today
- Total
chae._.chae
[Algorithm] 백준 #2110 공유기 설치 본문
728x90
반응형
https://www.acmicpc.net/problem/2110
2110번: 공유기 설치
첫째 줄에 집의 개수 N (2 ≤ N ≤ 200,000)과 공유기의 개수 C (2 ≤ C ≤ N)이 하나 이상의 빈 칸을 사이에 두고 주어진다. 둘째 줄부터 N개의 줄에는 집의 좌표를 나타내는 xi (0 ≤ xi ≤ 1,000,000,000)가
www.acmicpc.net
import sys
input = sys.stdin.readline
N, C = map(int, input().split())
position = [int(input()) for _ in range(N)]
position.sort()
# 가장 인접한 공유기 사이의 최대 거리 구하기
# 집 사이의 최소/최대 거리
start, end = 1, position[-1] - position[0]
result = 0
while start <= end:
mid = (start + end) // 2
cnt = 1 # 설치하는 공유기 갯수
current = position[0] # 마지막으로 설치된 공유기의 위치
for i in range(1, N):
if current + mid <= position[i]: # 현재 집에서 다음 집까지의 거리가 mid 이상인 경우 -> 공유기 설치
cnt += 1
current = position[i]
if cnt >= C: # 지정한 갯수보다 현재 설치된 공유기 갯수가 많다면 -> 설치 간격을 넓힌다
result = mid
start = mid + 1
else: # 지정한 갯수보다 현재 설치된 공유기 갯수가 적다면 -> 설치 간격을 좁힌다
end = mid - 1
print(result)
공유기를 설치할 거리를 이분탐색을 이용하여 결정한다.
이분탐색의 시작과 끝을 집 사이의 최소거리, 최대거리로 설정한다.
예제로 주어진 집의 위치가 [1, 2, 8, 4 ,9]를 보면
start = 1, end = 8로 설정하고 mid = (1+8)//2 = 4 이다.
이 mid 값을 기준으로 공유기 설치 여부를 결정하게 되는데, (현재 집 ~ 다음 집)의 거리가 mid를 초과한다면 공유기를 설치한다.
현재 mid=4이므로, 1과 8에 설치가능하다. 즉, 2개의 공유기만 설치가능하므로, mid의 값을 줄여가며 적당한 거리를 찾아나간다.
728x90
'파이썬 알고리즘 > BOJ' 카테고리의 다른 글
[Algorithm] 백준 DP #11053 가장 긴 증가하는 부분 수열 (0) | 2023.07.08 |
---|---|
[Algorithm] 백준 #2178 미로탐색 (0) | 2023.06.25 |
[Algorithm] 백준 #1541 잃어버린 괄호 (0) | 2023.06.18 |
[Algorithm] 백준 #1463 1로 만들기 (0) | 2023.06.18 |
[Algorithm] 백준 #1874 - 스택 수열 (0) | 2023.06.18 |