programmers.co.kr/learn/courses/30/lessons/43238
코딩테스트 연습 - 입국심사
n명이 입국심사를 위해 줄을 서서 기다리고 있습니다. 각 입국심사대에 있는 심사관마다 심사하는데 걸리는 시간은 다릅니다. 처음에 모든 심사대는 비어있습니다. 한 심사대에서는 동시에 한
programmers.co.kr
접근
이분탐색이 무엇인지는 알았지만 비슷한 유형의 문제만 풀어서 아직 완벽하게 이해하지 못했다.
이 문제는 고득점kit에 이분 탐색으로 분류되어 있다. 그래서 문제를 읽고 이분탐색으로 접근을 하려고했는데 도대체 어떻게 접근을 해야할지 감이 잡히지 않았다.
감이 잡히지 않은 이유
첫 번째는 이분 탐색을 완벽히 이해하지 못해서다. 왜 left와 right값을 주고 mid값을 통해 탐색을 진행하는지 겉핥기식으로 알았다.
두 번째는 입력으로 주어지는 n과 times에만 집중되어 있었다. 즉 n을 어떻게해야 이분탐색이 될까? times를 어떻게해야 이분탐색이 될까만 생각을 하였다.
이분탐색은 특정범위 안에서 답이 될 수 있는 범위를 좁혀나가는 것이다.
이 문제에서는 1분부터 times에 있는 시간 중 최댓값x사람의 수만큼 탐색의 범위를 정한다.
그리고 이 안에서 n명의 사람들이 심사를 받는 최솟값을 구하도록 한다.
구현
- 먼저 탐색의 범위를 정한다. left는 최소의 시간인 1분, right는 제일 오래걸리는 심사관이 n명을 모두 심사하는 하는 것으로 times의 최댓값 x n을 해주었다.
- 이제 left와 rigth로 mid를 구하여 탐색의 범위를 좁혀나간다.
- mid는 n명의 사람을 심사하는데 걸리는 시간이다. 이를 times에 있는 시간으로 모두 나누면 각 심사관이 몇 명을 심사할 수 있는지 나오게된다.
- 해당 값을 count에 저장하고 n명 이상일 때 종료시킨다.
- 만약 count가 n 이상이라면 최종해인 answer에 mid를 대입하고 오른쪽의 범위를 좁힌다. count가 많다는 것은 그만큼 심사하는 시간이 크고 한 심사관이 해당 시간동안 심사할 수 있는 사람이 많다는 것이다.
- 만약 count가 n 미만이면 심사시간이 더 필요한 것이기 때문에 왼쪽의 범위를 좁힌다.
- 이 과정에서 left가 right 이상이 된다면 탐색이 종료되고 answer에 최솟값이 담기게 될 것이다.
def solution(n, times):
answer = 0
left = 1
right = max(times) * n
while left <= right:
mid = (left+right)//2
count = 0
for time in times:
count += mid//time
if count >= n:
break
if count >= n:
answer = mid
right = mid - 1
else:
left = mid + 1
return answer
'알고리즘 풀이 > 프로그래머스' 카테고리의 다른 글
[Level 3] 순위 (0) | 2021.03.31 |
---|---|
[Level 2] 위장 (0) | 2021.03.30 |
[Level 2] 이진 변환 반복하기 (0) | 2021.03.27 |
[Level 2] 문자열 압축 (0) | 2021.03.25 |
[Level 2] 메뉴 리뉴얼 (0) | 2021.03.24 |