티스토리 뷰
입국심사
문제 설명
n명이 입국심사를 위해 줄을 서서 기다리고 있습니다. 각 입국심사대에 있는 심사관마다 심사하는데 걸리는 시간은 다릅니다.
처음에 모든 심사대는 비어있습니다. 한 심사대에서는 동시에 한 명만 심사를 할 수 있습니다. 가장 앞에 서 있는 사람은 비어 있는 심사대로 가서 심사를 받을 수 있습니다. 하지만 더 빨리 끝나는 심사대가 있으면 기다렸다가 그곳으로 가서 심사를 받을 수도 있습니다.
모든 사람이 심사를 받는데 걸리는 시간을 최소로 하고 싶습니다.
입국심사를 기다리는 사람 수 n, 각 심사관이 한 명을 심사하는데 걸리는 시간이 담긴 배열 times가 매개변수로 주어질 때, 모든 사람이 심사를 받는데 걸리는 시간의 최솟값을 return 하도록 solution 함수를 작성해주세요.
제한사항
- 입국심사를 기다리는 사람은 1명 이상 1,000,000,000명 이하입니다.
- 각 심사관이 한 명을 심사하는데 걸리는 시간은 1분 이상 1,000,000,000분 이하입니다.
- 심사관은 1명 이상 100,000명 이하입니다.
입출력 예
n | times | return |
---|---|---|
6 | [7, 10] | 28 |
입출력 예 설명
가장 첫 두 사람은 바로 심사를 받으러 갑니다.
7분이 되었을 때, 첫 번째 심사대가 비고 3번째 사람이 심사를 받습니다.
10분이 되었을 때, 두 번째 심사대가 비고 4번째 사람이 심사를 받습니다.
14분이 되었을 때, 첫 번째 심사대가 비고 5번째 사람이 심사를 받습니다.
20분이 되었을 때, 두 번째 심사대가 비지만 6번째 사람이 그곳에서 심사를 받지 않고 1분을 더 기다린 후에 첫 번째 심사대에서 심사를 받으면 28분에 모든 사람의 심사가 끝납니다.
풀이
이진탐색으로 금방 풀었지만 테스트 케이스에서 계속 오류가 났다. (3,5,7,8)
아무리 생각해도 로직은 맞는 것 같은데..(맞았음) 어디서 형변환이 틀린 것 같다는 생각은 했지만 도저히 감이 잡히지 않아서 결국 구글링을 해보았다.
구글링 통해 알아본 결과, 배열 times와 n은 둘 다 int형이고 두 곱이 int형을 초과할 수 있어서 long 형변환이 필요하다.
long maxTime = n * (long) times[times.length - 1];
연산된 결과를 받는 변수만 long 으로 해주면 되는 줄 알았다.. 형변환에 대해 다시 공부해봐야겠다..
- 두 피연산자가 모두 int형이면 변환하고 결과도 int형이다. 즉 위와 같이 한 변수를 long으로 바꿔주지 않으면 int 형으로 overflow가 난다.
- 두 피연산자 중 하나라도 long 이면 다른 하나도 long형으로 변환하고 결과도 long 이다.
코드
class Solution {
public long solution(int n, int[] times) {
long answer = 0;
Arrays.sort(times);
long maxTime = n * (long) times[times.length - 1];
long minTime = 1;
long midTime = 0;
answer = maxTime;
while (true) {
if (minTime > maxTime)
break;
midTime = (minTime + maxTime) / 2;
long cnt = count(times, midTime);
if (cnt >= n) {
answer = Math.min(midTime, answer);
maxTime = midTime - 1;
} else {
minTime = midTime + 1;
}
}
return answer;
}
long count(int[] times, long mid) {
long result = 0;
for (int i = 0; i < times.length; i++) {
result += (mid / times[i]);
}
return result;
}
}
'Algorithm > Programmers' 카테고리의 다른 글
[Programmers] 위장 (0) | 2021.01.12 |
---|---|
[Programmers] 전화번호목록 (0) | 2021.01.12 |
[Programmers] 완주하지 못한 선수 (0) | 2021.01.11 |
[Programmers] 다리를 지나는 트럭 (0) | 2020.03.14 |
[Programmers] 징검다리 (0) | 2020.03.05 |
- Total
- Today
- Yesterday
- 프로세스 스케줄링
- N-Queen
- 백트래킹
- Process Scheduling
- programmers
- 우선순위큐
- 기능개발
- 알고리즘
- MLQ
- hashtable
- 자료구조
- java
- 사회망서비스
- SWExpert
- MFQ
- git
- 3-way-handshake
- 프로그래머스
- 백 트래킹
- Android
- hash
- loss function
- 농협정보시스템IT
- binarySearch
- DFS
- 네트워크
- Objective function
- algorithm
- 4-way-handshake
- SRTN
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |