m1ndy5's coding blog

프로그래머스 입국심사 with Python 본문

알고리즘 with python/20240909

프로그래머스 입국심사 with Python

정민됴 2024. 10. 10. 23:52

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

def solution(n, times):
    answer = 0
    
    # 최대 시간
    max_times = n * max(times)
    
    s, e, m = 1, max_times, 0
    
    while s <= e:
        m = (s+e)//2
        
        # 심사 가능 명수
        cnt = 0
        
        for t in times:
            cnt += m//t
            
        if cnt < n:
            s = m + 1
        else:
            answer = m
            e = m - 1
            
    return answer

 

이 문제를 처음보고 했던 생각은 심사위원 한명한명 로테이션을 돌리는 방법이 아닌 뭔가 다른 방법이 있을 것 같다 라고 생각했다.

일단 최대로 걸릴 것 같은 시간을 구한뒤 (기다리는 사람 * 제일 긴 심사 시간) 그 시간을 좁혀보자가 아이디어였다.

 

예를 들어 30분이 정답이라고 놓고 보면

7분 심사위원은 4명을, 10분 심사위원은 3명을 심사할 것이다. (비동기로 진행하기 때문에)

그럼 총 30분이면 7명을 심사할 수 있는 것이다.

 

이러한 느낌으로 이분탐색을 사용하여 최적의 시간을 찾아갔다.

여기서 가장 중요한 포인트는 어 6명 심사 가능이네? 정답이다! 가 아닌

6명 가능이지만 가능한 시간중에서도 가장 짧은 시간을 구해야한다는 것이다.

그래서 6명이 가능일 때도 일단 answer에 저장을 하고 계속 해서 이분탐색을 이어나가고 s가 e를 이기는 순간이 오면 종료한다.

이 때 저장된 값이 가장 짧은 시간일 것이다!