목차
마구간정하기(결정알고리즘)
N개의 마구간이 수직선상에 있습니다. 각 마구간은 x1, x2, x3, ......, xN의 좌표를 가지며, 마 구간간에 좌표가 중복되는 일은 없습니다.
현수는 C마리의 말을 가지고 있는데, 이 말들은 서로 가까이 있는 것을 좋아하지 않습니다.
각 마구간에는 한 마리의 말만 넣을 수 있고, 가장 가까운 두 말의 거리가 최대가 되게 말을 마구간에 배치하고 싶습니다.
C마리의 말을 N개의 마구간에 배치했을 때 가장 가까운 두 말의 거리가 최대가 되는 그 최대 값을 출력하는 프로그램을 작성하세요.
▣ 입력설명
첫 줄에 자연수 N(3<=N<=200,000)과 C(2<=C<=N)이 공백을 사이에 두고 주어집니다. 둘째 줄부터 N개의 줄에 걸쳐 마구간의 좌표 xi(0<=xi<=1,000,000,000)가 한 줄에 하나씩 주어집니다.
▣ 출력설명
첫 줄에 가장 가까운 두 말의 최대 거리를 출력하세요.
▣ 입력예제 1
5 3
1
2
8
4
9
▣ 출력예제 1
3
나의 코드
n,c=map(int,input().split())
arr=[]
for _ in range(n):
arr.append(int(input()))
arr.sort()
l=2
r=max(arr)
res=0
while l<=r:
cnt=1
mid=(l+r)//2
start=arr[0]
for i in range(n-1):
if (arr[i+1]-start) <mid:
continue
elif (arr[i+1]-start) >=mid:
cnt+=1
start=arr[i+1]
if cnt <c:
r=mid-1
elif cnt>=c:
l=mid+1
res=mid
print(res)
정답코드
import sys
sys.stdin=open("input.txt", "r")
def Count(len):
cnt=1
ep=Line[0]
for i in range(1, n):
if Line[i]-ep>=len:
cnt+=1
ep=Line[i]
return cnt
n, c=map(int, input().split())
Line=[]
for _ in range(n):
tmp=int(input())
Line.append(tmp)
Line.sort()
lt=1
rt=Line[n-1]
while lt<=rt:
mid=(lt+rt)//2
if Count(mid)>=c:
res=mid
lt=mid+1
else:
rt=mid-1
print(res)
나의 코드와 로직이 모두 같다..!
'코딩테스트[파이썬] > 알고리즘 문제풀이 입문' 카테고리의 다른 글
[이진탐색]- 씨름선수(그리디) (0) | 2024.02.07 |
---|---|
[이진탐색] - 회의실 배정(그리디) (0) | 2024.02.07 |
[이분탐색]- 뮤직비디오(결정알고리즘) (0) | 2024.02.06 |
[이분탐색] - 랜선자르기(결정알고리즘) (0) | 2024.02.06 |
[이분탐색] - 이분검색 (2) | 2024.02.06 |