220518 - 징검다리

이상해씨·2022년 5월 18일
0

알고리즘 풀이

목록 보기
77/94

◾ 징검다리 : 프로그래머스 LEVEL 4

문제

출발지점부터 distance만큼 떨어진 곳에 도착지점이 있습니다. 그리고 그사이에는 바위들이 놓여있습니다. 바위 중 몇 개를 제거하려고 합니다.

예를 들어, 도착지점이 25만큼 떨어져 있고, 바위가 [2, 14, 11, 21, 17] 지점에 놓여있을 때 바위 2개를 제거하면 출발지점, 도착지점, 바위 간의 거리가 아래와 같습니다.

제거한 바위의 위치각 바위 사이의 거리거리의 최솟값
[21, 17][2, 9, 3, 11]2
[2, 21][11, 3, 3, 8]3
[2, 11][14, 3, 4, 4]3
[11, 21][2, 12, 3, 8]2
[2, 14][11, 6, 4, 4]4

위에서 구한 거리의 최솟값 중에 가장 큰 값은 4입니다.

출발지점부터 도착지점까지의 거리 distance, 바위들이 있는 위치를 담은 배열 rocks, 제거할 바위의 수 n이 매개변수로 주어질 때, 바위를 n개 제거한 뒤 각 지점 사이의 거리의 최솟값 중에 가장 큰 값을 return 하도록 solution 함수를 작성해주세요.


입력

  • 도착지점까지의 거리 distance는 1 이상 1,000,000,000 이하입니다.
  • 바위는 1개 이상 50,000개 이하가 있습니다.
  • n은 1 이상 바위의 개수 이하입니다.

출력

  • 바위를 n개 제거한 뒤 각 지점 사이의 거리의 최솟값 중에 가장 큰 값

입출력 예

distancerocksnreturn
25[2, 14, 11, 21, 17]24

◾ 풀이

1. 해설

  • 거리의 최소값(mid)을 기준으로 이분 탐색을 진행한다.
    • 바위 사이의 거리가 mid이하인 경우 바위 1개를 삭제한다.
    • 결과는 거리 중 최소값을 찾고 비교해 더 큰 값으로 업데이트한다.
    • 삭제한 바위의 수가 n을 넘어가면 mid를 줄이고 적거나 같은 경우 mid를 크게한다.
    • distance : 최대 1,000,000,000 | rocks : 최대 50,000
    • O(r_n*log(d)) -> 최대 450,000으로 계산 가능

2. 프로그램

  1. rocks 정렬 및 distance 추가
  2. left, right 초기화
  3. mid를 기준으로 이분 탐색
    • rocks의 바위들 사이의 거리 확인
    • mid보다 짧은 거리일 경우 바위 1개 삭제
    • 바위 사이의 최소 거리 확인
    • 삭제한 바위가 n개 초과일 경우 [right = mid -1]
    • 삭제한 바위가 n개 이하일 경우 [left = mid + 1], answer 최대값으로 변경
# 코드
def solution(distance, rocks, n):
    answer = 0
    
    rocks.sort()
    rocks.append(distance)
    
    left, right = 0, distance
    while left <= right:
        mid = (left + right) // 2  
        min_distance = float('inf')
        current = 0
        remove_cnt = 0
        
        for rock in rocks:
            diff = rock - current
            if diff < mid:
                remove_cnt += 1
                if remove_cnt > n:
                    break
            else:
                current = rock
                min_distance = min(min_distance, diff)
        
        if remove_cnt > n:
            right = mid - 1
        else: 
            answer = max(min_distance, answer)
            left = mid + 1

    return answer

profile
후라이드 치킨

0개의 댓글

관련 채용 정보