마음만 바쁜 사람
Published 2022. 5. 3. 15:32
2110-공유기 ALGORITHM/BOJ

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

이제까지 풀던 이분탐색 문제의 조오금 고급 버전..! 전체적인 구성은 이전의 문제들과 동일하지만 is_possible에서의 조건을 조금 더 구체적으로 분리해 주어야 한다. 

 

사이트에 반례가 많이 없어서 예외처리를 해주는데 시간이 조금 걸렸다. 내 코드가 조금 더러운것 같기도.?

 

1. lo, hi, mid를 정할때, mid는 배열의 (최대-최소) // 공유기 개수 로 놓고 lo의 초기상태는 1로 두어야 한다.

   처음에는 lo를 min(house)로 두었는데 이러면 거리가 아닌 하우스 위치의 최솟값이 초기 상태가 되어버려 답이 출력되지 않을 수 있다.

 

2. 공유기의 개수(C) 가 2일때는 is_possible를 실행하면 안된다. 나의 경우 is_possible에서 예외처리를 하였는데 그냥 C가 2이면 배열의 최대-최소로 답을 출력하는게 더 깔끔한 방법일듯 하다

 

3. 괄호 방향, 부등호 잘 확인하자 -> 이분 탐색 문제를 풀 때 항상 살짝은 헷갈리는 부분이다. 실행과정을 따라가면서 자세히 조건을 달아주자

<python />
import sys input = sys.stdin.readline N, C = map(int, input().split()) house = sorted([int(input()) for _ in range(N)]) lo = min(house) hi = max(house) mid = (hi-lo) // C lo = 1 def is_possible(mid): cnt = C-2 last = 0 if cnt == 0: print(max(house)- min(house)) exit(0) for i in range(1, N-1): if house[i] - house[last] >= mid: last = i cnt -= 1 if cnt == 0 and house[N-1] - house[i] < mid: return False if cnt > 0: return False else: return True ans = 0 while lo <= hi: if is_possible(mid): lo = mid+1 ans = mid else: hi = mid -1 mid = (lo + hi) // 2 print(ans)

 

'ALGORITHM > BOJ' 카테고리의 다른 글

7569-토마토  (0) 2022.06.01
7453-합이 0인 네 정수  (0) 2022.05.04
11663-선분 위의 점  (0) 2022.05.03
1654-랜선 자르기  (0) 2022.05.02
2805-나무 자르기  (0) 2022.05.02
profile

마음만 바쁜 사람

@훌루훌루

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!