[python]백준2110:공유기설치

죽부인·2023년 3월 21일
0

📌난이도🥇

📌코드


import sys
input = sys.stdin.readline
N, C = map(int, input().split())
house = []
for _ in range(N):
    house.append(int(input()))

house.sort()

# print(house)

start = 1
end = house[-1] - house[0]


while start <= end:
    mid = (start + end) // 2 
    
    curPo = house[0]
    count = 1
                                        # start 와 end 는 curPo + mid +1
    if C == 2:                          # 개수 2 일 때는 처음, 끝 노드에 존재
        print(end)                      # 최대거리 = end 
        exit(0)
    else:      # C >= 3
        for i in range(1, len(house)):
            if house[i] > curPo + mid:  # 다음 공유기 위치 = (curPo + mid+1) 이상
                curPo = house[i]        # 공유기 설치 위치
                count += 1              # 공유기 개수 증가
                

        if count >= C:                  # 설치개수 > C -> mid 증가 -> 설치개수 ↓
            start = mid + 1                

        else:                           # 설치개수 < C -> mid 감소 -> 설치개수 ↑
            end = mid - 1

print(start)                            # 최대 mid 일때 좌표간 사이거리는 start = mid + 1 이므로
  • startend 는 좌표( 공유기 )간 최소거리, 좌표간 최대 거리
    mid는 공유기와 공유기 사이의 거리를 의미한다.
    그렇기에 start = mid +1 , end = mid + 1 관계가 될 수 있다.

  • curPo 는 최근에 공유기가 설치된 위치

  • C == 2 라면 처음과 끝에 공유기가 설치된 end 일때가 출력되고
    C >= 3 이라면 처음 부터 mid+1 만큼 떨어진 위치에 공유기를 설치해 나아간다.

  • count < C : 차이거리 mid 줄이려고 end = mid -1
    count > C : 차이거리 mid 늘리려고 start = mid + 1
    count == C : start <= end 조건에 만족하는 mid의 최댓값을 구하기 위해서 start = mid +1 로 다음 단계도 진행해본다. 만약 start <= end 조건에 만족하지 않으면 mid 가 최대일 때 start의 값이 mid +1 이므로 답은 start를 출력하게 된다.

📌후기

이분탐색 너무 어려운 것 같다.
이문제에서는 startend 의 개념은 전혀 생각하지 못했다.

  • count == C 일 때를 잘 생각해볼 수 있으면 좋겠다.*
 if count >= C:                  
            start = mid + 1  
  • 이분탐색일 때 start <= end 도 꼭 기억 !!

두가지 자꾸 풀 때마다 고민하는 것 같다

profile
연습장 입니다.

0개의 댓글