[코딩테스트]이진탐색_입국심사, 징검다리

쟈니·2023년 3월 27일
0

프로그래머스 : 입국심사

def solution(n, times):
    answer = 0
    # right는 가장 비효율적으로 심사했을 때 걸리는 시간
    # 가장 긴 심사시간이 소요되는 심사관에게 n 명 모두 심사받는 경우이다.
    left, right = 1, max(times) * n
    while left <= right:
        mid = (left+ right) // 2
        people = 0
        for time in times:
            # people 은 모든 심사관들이 mid분 동안 심사한 사람의 수
            people += mid // time
            # 모든 심사관을 거치지 않아도 mid분 동안 n명 이상의 심사를 할 수 있다면 반복문을 나간다.
            if people >= n:
                break
        
        # 심사한 사람의 수가 심사 받아야할 사람의 수(n)보다 많거나 같은 경우
        if people >= n:
            answer = mid
            right = mid - 1
        # 심사한 사람의 수가 심사 받아야할 사람의 수(n)보다 적은 경우
        elif people < n:
            left = mid + 1
            
    return answer
def solution(n, times):
    answer = 0
    start, end, mid = 1, times[-1] * n, 0

    while start < end:
        mid = (start + end) // 2
        total = 0
        for time in times:
            total += mid // time

        if total >= n:
            end = mid
        else:
            start = mid + 1
    answer = start
    return answer


접근방식

![]

후기

다른 사람의 풀이가 더 좋아서 가지고 왔다.

  • start를 최소로 잡기
  • 아직 범위를 잘 못잡는거 같다.

프로그래머스 : 징검다리

def solution(distance, rocks, n):
    rocks.sort()
    
    s, e, m = 0, distance, 0
    answer = 0
    while s <= e: # n 이 깨진 바위의 개수, 이분탐색은 거리로 한다.
        m = (s + e) // 2
        # print(m)
        rock_cnt, start, flag, backup = 0, 0, True, 0
        for rock in rocks:  ## 마지막 도착점과의 거리를 생각하지 않았다
            d = rock - start
            if d < m: # 바위 파괴
                rock_cnt += 1
            else:
                start, backup = rock, start # backup 에 그 전 start 위치 저장해놓기
    
        if rocks[-1] == start: # 마지막 돌이 파괴 안되고, 목 적지와의 거리가 m 보다 작을 때 -> 마지막돌 파괴해야함
            if distance - start < m:
                rock_cnt += 1
                start = backup # 스타트의 위치를 백업한 스타트의위치로 갱신해놓기
        
        if distance - start < m: # 종점과의 거리가 기준치 m 보다 작을때 --> m 이 더 작아도 똑같이 파괴할수 있다는 뜻
            flag = False # 이 m은 올바른 답이 아니라는 것을 표시
        
        # rock_cnt : 거리의 최솟값의 최댓값이 m 이기 위해서 파괴되어야 하는 바위의 개수
        ## 거리의 최솟값의 최댓값이 유효하려면 바위 사이의 거리들중 일치하는 거리가 있어야 한다. --> 처리 안함
        
        if n < rock_cnt: # 파괴한 바위가 많으면  -> m 줄어야    
            e = m - 1
        else: # 파괴한 바위가 적거나 같을 때
            if flag == False:
                e = m - 1
            else:
                s = m + 1
                answer = m


접근방식

![]

후기

다른 사람의 풀이가 더 좋아서 가지고 왔다.

  • 진짜 아무리 봐도 이해가 안되는 문제..(레벨 4는 맵다매워)
  • 프로그래머스의 질문하기 중 이해에 도움에 되었던 블로그를 참고하였다
  • 덕분에 접근하는 방식에서 내가 뭘 잘못 했는지 알수 있었다.
  • 이제는 참고하지 말고 내 머리로 풀고싶다..(에효효)
profile
시작은 미미하나 끝은 쥬쥬하다.

0개의 댓글