프로그래머스 입국심사
업데이트:
개요
자바로 프로그래머스 문제를 풀다가 생긴 Issue 를 가볍게 정리 해보려고 한다.
프로그래머스>이분탐색>입국심사
프로그래머스에 있는 입국심사 라는 문제다. https://programmers.co.kr/learn/courses/30/lessons/43238
해답.
import java.util.*;
class Solution {
public long solution(int n, int[] times) {
long answer = Long.MAX_VALUE;
Arrays.sort(times);
long left = 0;
long right = 0;
for (int time : times) {
if (time > right) {
right = time;
}
}
right *= n;
long mid = 0;
while(left <= right){
mid = (left + right)/2 ;
long personNum = 0;
for(int time:times){
long temp = mid /time;
personNum += temp;
}
if(personNum < n){
left = mid+1;
}else {
answer = Math.min(mid,answer);
right = mid-1;
}
}
return answer;
}
}
문제
이분탐색 문제로 left 값과 right 값을 초기화 해주었다. left 값은 0 을 초기값으로 주었고, right 값을 초기화 하는데에서 문제가 발생했다.
위에서는
long right = 0;
for (int time : times) {
if (time > right) {
right = time;
}
}
right *= n;
와 같이 right 를 초기화 해주어서 정답이 되었지만,
처음에 문제를 풀때에는 아래와 같이 정렬 후 마지막 값에 n 을 곱해주었다.
Arrays.sort(times);
long right = times[times.length-1] * n;
아래처럼 문제를 풀었을때에는 testcase 9 개중 4개가 실패하는 현상이 발생 했고, 아무리 생각해도 이유를 찾을 수 없었다. 지인에게 물어본 결과
times[times.length-1] * n;
에서 int 형 값끼리 곱해서 long 값이 들어가지 않고 오버플로우가 발생한걸 알게 되었다.
결론
답을 알고 보니 이 단순한 걸 모르고 넘어갔나 싶기도 하고 지인에게 물어 봤던 자체가 부끄러웠다. 좀더 기본을 다질 수 있는 계기로 생각하고 열심히 해야곘다.
댓글남기기