본문 바로가기
Algorithm/Python

[프로그래머스] 입국 심사

by _sweep 2022. 2. 13.

문제 링크 >> https://programmers.co.kr/learn/courses/30/lessons/43238

 

 

📋 문제

n명이 입국심사를 위해 줄을 서서 기다리고 있습니다.

각 입국심사대에 있는 심사관마다 심사하는데 걸리는 시간은 다릅니다.

 

처음에 모든 심사대는 비어있습니다.

한 심사대에서는 동시에 한 명만 심사를 할 수 있습니다.

가장 앞에 서 있는 사람은 비어 있는 심사대로 가서 심사를 받을 수 있습니다.

하지만 더 빨리 끝나는 심사대가 있으면 기다렸다가 그곳으로 가서 심사를 받을 수도 있습니다.

 

모든 사람이 심사를 받는데 걸리는 시간을 최소로 하고 싶습니다.

입국심사를 기다리는 사람 수 n, 각 심사관이 한 명을 심사하는데 걸리는 시간이 담긴 배열 times가 매개변수로 주어질 때, 모든 사람이 심사를 받는데 걸리는 시간의 최솟값을 return 하도록 solution 함수를 작성해주세요.

 

 

👉 출력

  • 입국심사를 기다리는 사람은 1명 이상 1,000,000,000명 이하입니다.
  • 각 심사관이 한 명을 심사하는데 걸리는 시간은 1분 이상 1,000,000,000분 이하입니다.
  • 심사관은 1명 이상 100,000명 이하입니다.

 

 

 

📝 풀이

def solution(n, times):
    start = 1
    end = max(times) * n
    
    while start <= end:
        mid = (start + end) // 2
        count = 0
        
        for t in times:
            count += mid//t
            if count >= n:
                break
        
        if count >= n:
            end = mid - 1
        else:
            start = mid + 1
    return start

 

이분탐색 문제였다.

입력으로 주어지는 n은 입국 심사를 기다리는 사람의 수이고 times에는 각 심사관들이 심사하는데 걸리는 시간이 들어있다.

 

심사에 걸리는 최소 시간이 1분이므로 start를 1, end는 times의 max 값에 n을 곱한 값으로 설정한다.

max(times) * n는 가장 오래 걸리는 심사관에게 n명의 사람들이 모두 심사를 받는 최악의 결과를 상정한다.

 

아무튼 start와 end 값의 중간 값을 mid에 저장하고 for 문 안에서 심사를 해 나간다.

count에 mid//t의 값을 더하는 것은 각 심사관들이 mid라는 시간 동안 몇 명을 심사했는지 알아보기 위함이다.

이때 이미 count의 수가 우리가 심사해야 할 인원인 n명의 수를 넘겼다면 더 이상 심사할 필요가 없으므로 for문의 순회를 종료한다.

 

그리고 count의 상태에 따라 start 혹은 end의 값을 조정해 나가며 최적의 값을 찾는다.

 

이분 탐색 개념도 알고 어떤 식으로 풀면 되겠다 하는 생각은 드는데 그래서 이걸 어떤 값을 적용시키는데? 하고만다.

음... 어렵다.

 

 

 

 

 

'Algorithm > Python' 카테고리의 다른 글

[백준 11399번] ATM  (0) 2022.02.15
[백준11047번] 동전 0  (0) 2022.02.15
[백준1931번] 회의실 배정  (0) 2022.02.05
[백준2108번] 통계학  (0) 2022.02.04
[백준11728번] 배열 합치기  (0) 2022.02.04

댓글