프로그래머스 입국심사

업데이트:

개요

자바로 프로그래머스 문제를 풀다가 생긴 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 값이 들어가지 않고 오버플로우가 발생한걸 알게 되었다.

결론

답을 알고 보니 이 단순한 걸 모르고 넘어갔나 싶기도 하고 지인에게 물어 봤던 자체가 부끄러웠다. 좀더 기본을 다질 수 있는 계기로 생각하고 열심히 해야곘다.

댓글남기기