Algorithm/Programmars

[JAVA] 입국심사 - 프로그래머스[Lv.3]

mopipi 2024. 1. 25. 18:15
반응형

https://school.programmers.co.kr/learn/courses/30/lessons/43238

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


import java.util.*;
class Solution {
    static long cnt;
    public long solution(int n, int[] times) {
        long answer = 0;
        Arrays.sort(times);
        long left = 0;
        long right = (long) times[times.length - 1] * n;

        while(left <= right){
            long mid = (left + right) / 2 ;
            cnt = getTotal(times, mid);
            if(cnt >= n){
                answer = mid;
                right = mid - 1;
            }else
                left = mid + 1;
        }
        return answer;
    }
    private static long getTotal(int[] times, long total){
        long cnt = 0;
        for(int time : times){
            cnt += total / (long) time;
        }
        return cnt;
    }
}

💡 이분 탐색

풀이

  • 이분 탐색에 사용할 인덱스를 소요 시간으로 두고 최소 시간을 찾아 나가야 함!
  • 이때 문제조건 상, 변수형 long으로 선언해서 오버플로우 방지 (형 변환 주의)
  • 오른쪽으로 탐색할지, 왼쪽으로 탐색할지 판단 기준 ➡️  해당 시간(mid)에 각 라인에서 심사 가능한 총 사람 수(cnt)
    • cnt >= n 인 경우, 시간을 줄여줘야 함
      • answer = mid 갱신
      • right = mid - 1 로 갱신
    • cnt < n 인 경우, 시간 모자르므로 오른쪽 탐색
      • left = mid+1
cnt == n 일 경우만, answer 갱신하면 틀리는 이유

[반례] n = 59, times=[1,1]  ;  answer=30
 -  mid = 29 / cnt = 58 -> left = 30, mid = 30 / cnt = 60  이 경우 answer이 갱신 불가능함
  ➡️ 나머지로 인해 cnt == n인 경우를 스킵하고 n에 가장 가까운 cnt가 정답처리 되는 경우가 있음!!
❗ ❗ 어차피 mid는 정답에 가깝게 항상 갱신되므로 cnt >= n일 경우 계속 갱신해줄 것

 

반응형