사용 언어 - PyPy3
2110번: 공유기 설치 (골드4, 이분 탐색)
문제 ★이분 탐색 문제★
2110번: 공유기 설치
첫째 줄에 집의 개수 N (2 ≤ N ≤ 200,000)과 공유기의 개수 C (2 ≤ C ≤ N)이 하나 이상의 빈 칸을 사이에 두고 주어진다. 둘째 줄부터 N개의 줄에는 집의 좌표를 나타내는 xi (0 ≤ xi ≤ 1,000,000,000)가
www.acmicpc.net
python3으로는 시간 초과로 오답이지만, pypy3으로는 정답!
이분탐색은 while문으로 돌아가서 python보다 빠른 pypy3으로 했을 때만 정답이 나올 수 있다.

정답
집 좌표값의 차이를 start/end/mid 값을 지정하는 이분탐색 문제 !!
(코드 풀이)
1. 변수 선언
n 집의 개수
c 공유기의 개수
house 집 좌표값 리스트 -> 이분탐색 타겟이므로 sort()해주기!
집 좌표값 끼리의 거리를 확인해야하므로 집 좌표값의 차이를 start/end/mid 값으로 지정한다.
가장 가까운 거리는 1이기 때문에, start=1로 선언한다.
가장 먼 거리는 가장 먼 좌표값에서 가장 가까운 좌표값의 차이기 때문에, end = house[-1]-house[0] 로 선언한다.
결과값을 저장할 answer=0을 선언한다.
2. 이분 탐색 정의
mid는 start와 end의 중간값이다.
가장 가까운 집 좌표값부터 테스트해야하므로, current = house[0] 으로 시작해준다.
현재 테스트하는 대상 house[0]와 거리mid를 더한 값이 c-1개 만큼 나오는 지를 확인해야한다.
현재 위치에서 거리만큼 이동했을 때보다 크거나같은 집 좌표값이 있는지 확인한다.
거리를 mid로 두었을 때, 가능한 집의 개수를 cnt 변수로 세고, cnt가 c가 될 때까지 이분탐색을 진행한다.
가능한 집의 수가 cnt >= c 라면 start를 mid+1로, 가능한 집의 수가 cnt < c 라면 end를 mid-1로 갱신한다.

3. 출력
answer는 cnt >= c가 될때마다 mid로 저장된다.
가장 마지막에 저장한 mid 값이 정답이 된다.
# 정답 - 이분탐색
n, c = map(int,input().split())
house = []
for i in range(n):
house.append(int(input()))
house.sort()
start, end = 1, house[-1]-house[0]
result = 0
while start <= end:
mid = (start+end)//2
current = house[0]
cnt = 1
for i in range(1,n):
if house[i] >= current + mid:
cnt += 1
current = house[i]
if cnt >= c:
start = mid +1
result = mid
else:
end = mid - 1
print(result)
레퍼런스
- 정답 참고
[백준] 2110 공유기 설치 파이썬 풀이
정답률: 47.63% 풀이시간: 40분 분류: 이분 탐색 링크: [link]
assaeunji.github.io
- 정답 깃허브
GitHub - yyeongeun/codingtest: 코딩테스트 공부
코딩테스트 공부. Contribute to yyeongeun/codingtest development by creating an account on GitHub.
github.com
- pypy, python 언어차이
백준 문제 풀때, python3과 pypy3의 차이
처음에는 pypy라는 다른 언어가 있는 줄 알았다. (워낙 언어가 다양하다 보니..) 그런데 2805 번 문제를 풀다보니 계속 시간 초과가 났다. 그래서 뭐가 잘못 됐는지 구글링을 해봤는데, 블로그에 올
happybplus.tistory.com
'Algorithm > 이분탐색' 카테고리의 다른 글
[백준] 12015번 가장 긴 증가하는 부분 수열 2 (0) | 2023.01.23 |
---|---|
[백준] 1300번 K번째 수 (0) | 2023.01.21 |
[백준] 2805번 나무 자르기 (0) | 2023.01.21 |
[백준] 10816번 숫자 카드 2 (0) | 2023.01.21 |
[백준] 1920번 수 찾기 (0) | 2023.01.21 |
댓글