문제 설명
n명이 한줄로 입국심사를 기다리고 있고, 각 입국심사대에서 한 명의 심사를 하는 데 걸리는 시간이 times 배열에 주어질 때 모든 사람이 심사를 받는 데 걸리는 최소 시간을 구하는 문제입니다.
제한사항
- 입국심사를 기다리는 사람(n)은 1명 이상 1,000,000,000명 이하입니다.
- 각 심사관이 한 명을 심사하는데 걸리는 시간(times 원소의 크기)은 1분 이상 1,000,000,000분 이하입니다.
- 심사관(times 배열의 길이)은 1명 이상 100,000명 이하입니다.
풀이
첫 번째 풀이
아이디어
우선순위 큐를 사용해 심사한 사람의 수를 하나씩 증가시키며 심사대에 배치해, n이 될 때까지 반복합니다.
코드 (Java)
결과 (Java)
입국심사를 기다리는 사람(n) 이 최대 1,000,000,000 명이기 때문에 O(n)의 시간복잡도로 풀이가 불가능했습니다.
두 번째 풀이
아이디어
아래 블로그의 풀이를 참고했습니다.
시간을 기준으로 해서, 시간의 최솟값과 최댓값을 이진탐색으로 조정해가며 모든 사람이 심사를 받는 데 걸리는 최솟값을 찾았습니다.
[프로그래머스] 입국심사 (Python) / 이분탐색
java로 풀 경우, maxTime(이진 탐색의 범위 중 큰 값)의 초깃값을 설정하는 부분에서 주의해야 합니다.
long 자료형으로 선언만 하면 times의 최댓값과 n이 모두 1,000,000,000 일 때, 1,000,000,000(int) 와 1,000,000,000(int) 의 곱이기 때문에 int의 범위를 벗어나 값이 깨진 상태로 maxTime 변수에 저장됩니다. 따라서 초기화해줄 때, 둘 중 하나의 값을 long 형으로 변환해 long 와 int 의 곱으로 만들어 값이 깨지지 않도록 해야합니다.
이진 탐색을 반복하는 과정에서 while문의 조건을 minTime < maxTime 로 두게 된다면, 찾으려는 값이 4일 때 아래와 같은 상황이 있기 때문에 답이 아니게 됩니다.
minTime | maxTime | midTime | time (구하려는 값) |
1 | 5 | 3 | 3 |
4 | 4 | 4 < 4 가 아니기 때문에 더이상 탐색하지 않고 3 반환 |
코드 (Java)
결과 (Java)
코드 (Python)
결과 (Python)
'알고리즘 > 문제풀이' 카테고리의 다른 글
[프로그래머스] 60063 - 블록 이동하기 (Python) (1) | 2022.09.13 |
---|---|
[프로그래머스] 118670 - 행렬과 연산 (Python) (1) | 2022.08.21 |
[프로그래머스] 118669 - 등산코스 정하기 (Python) (3) | 2022.08.19 |
[프로그래머스] 92343 - 양과 늑대 (Java) (0) | 2022.07.13 |
댓글