파이썬 알고리즘-25 (탐색, 그리디) 마구간 정하기

jiffydev·2020년 9월 1일
0

Algorithm

목록 보기
27/134
post-thumbnail

25.마구간 정하기(결정알고리즘)
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

내 코드

이진탐색 범위까지는 구하는데 그 안에서 cnt를 못구한다.

풀이

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)

반성점

  • 이진탐색 마지막 문제인데도 지금까지 계속 똑같은 곳에서 막혀서 틀리고 있다. 자살이 답인듯

배운 것

  • 리스트 사이의 거리를 구해서 기준치보다 클 때만 cnt+1하는 법은 시작 포인트 값을 변수에 저장하고, 반복문을 돌리면서 다음 위치 값 - 시작 값이 기준치보다 클 때만 다음 위치 값을 시작 위치 값과 바꿔 주고 cnt+1
profile
잘 & 열심히 살고싶은 개발자

0개의 댓글