프로그래머스_입국심사_재풀이(2)

임정민·2024년 1월 9일
1

알고리즘 문제풀이

목록 보기
140/173
post-thumbnail

프로그래머스 Lv3 문제입니다. 실전에 대비하기 위해 60분 시간제한을 두고 풀었습니다.

문제

https://school.programmers.co.kr/learn/courses/30/lessons/43238#

[나의 풀이]

⌛ 미구현


def solution(n, times):
    
    answer = -1
    gates = {str(time):0 for time in times}
        
    while n>-2:
        answer += 1

        tmp_gates = []
        
        for gate,rest in gates.items():
            if gates[gate]==0: 
                tmp_gates.append(gate)
                n -= 1
        tmp_gates.sort(reverse=True)
        
        for tmp_gate in tmp_gates:
            gates[tmp_gate] = int(tmp_gate)
            # n -= 1

        for gate,rest in gates.items():
            gates[gate] -= 1

    return answer 

입국 심사인원(n)과 입국심사대별 소요시간 리스트(times)가 주어질 때, 완료된 입국심사대를 우선으로 활용하여 모든 입국 심사인원을 심사할 수 있는 최소값을 구하는 문제입니다.

문제를 정의하는 것 자체는 어렵지 않았지만 이를 구현하는데는 어려움이 있었습니다. while문으로 매 시간별로 완료된 입국심사대를 찾고 빈 입국심사대에 인원을 넣는 방식으로 시도하였지만 입력되는 최대값의 시간복잡도를 해결하기 어려워 다른 풀이를 참고하였습니다.🐥🐥🐥

[다른 사람의 풀이1]


def solution(n, times):
    answer = 0    
    start, end = 1, max(times)*n
    
    while start<=end:
        
        mid = (start+end)//2
        tmp = 0
        
        for time in times:
            tmp += (mid//time)
                
        if n<=tmp:
            end=mid-1
            answer = mid
        else:
            start=mid+1
    
    return answer

이분탐색을 활용하여 구하는 방식입니다.

매 시간을 카운트하여 순차적으로 확인하는 것이 아닌 심사하는 최솟값, 최대값 범위를 정하고 이분탐색하여 mid 값을 찾아나가는 것입니다.

최대값은 가장 오래걸리는 심사대*n을 기준으로 정하며 n명 모두 심사할 수 있는 최솟값을 갱신하며 최소 시간을 구할 수 있었습니다.

입력값이 1,000,000,000과 같이 아주 큰 수일 때 이분탐색을 먼저 떠올려야함을 알 수 있었습니다.🦙🦙🦙

[다른 사람의 풀이2]


def available(n, times, t): # can evaluate n people within t time
    temp = 0
    for time in times:
        temp+= t//time
        if temp >=n:
            return 1
        else : 
            continue
    return 0

def solution(n, times):
    max_t = max(times)*n
    min_t = 1

    def search(min_t, max_t):
        # when will it return? 
        if ((max_t + min_t)//2 == min_t):
            if available(n, times, min_t):
                return min_t
            else:
                return max_t

        mid_t = (max_t + min_t)//2
        flag = available(n, times, mid_t)

        if flag == 1:
            return search(min_t, mid_t)
        else : # flag == 0
            return search(mid_t, max_t)

    return search(min_t, max_t)

이분탐색을 활용한 다른 표현의 풀이입니다.🐪🐪🐪

감사합니다.

profile
https://github.com/min731

0개의 댓글