728x90

문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/43238?language=java# 

 

코딩테스트 연습 - 입국심사

n명이 입국심사를 위해 줄을 서서 기다리고 있습니다. 각 입국심사대에 있는 심사관마다 심사하는데 걸리는 시간은 다릅니다. 처음에 모든 심사대는 비어있습니다. 한 심사대에서는 동시에 한

programmers.co.kr

 

 

 

 

접근 방법

이분탐색으로 푸는 문제인데 형변환에 주의해야 한다.

처음에는 아래와 같이 우선순위 큐로 풀었는데 시간초과가 떴다.

import java.util.*;

class Solution {
    public long solution(int n, int[] times) {
        long answer = 0;
        int len = times.length;
        
        PriorityQueue<Long> pq = new PriorityQueue<Long>();
        
        for(int i = 0; i<len; i++){
            for(int j = 1; j<=n; j++){
                pq.add((long)times[i]*j);
            }
        }
        long cnt = 0;
        while(!pq.isEmpty()){
           cnt += 1;
            long num = pq.poll();
            //System.out.println(num);
            if(cnt==n){
                answer = num;
                break;
            }
        }
        
        return answer;
    }
}

 

 

그래서 이분 탐색으로 해결하였다.

import java.util.*;

class Solution {
    public long solution(int n, int[] times) {
        
        int len = times.length;
        Arrays.sort(times);
        
        long maxi = (long) times[len-1] * n;		//여기서 형변환 안 하면 틀림.
        long answer = maxi;
        
        long left = 1;
        long right = maxi;
        while(left<=right){
            long mid = (left+right)/2;
            
            long sum = 0;					//sum 도 long 으로!
            for(int i = 0; i<len; i++){
                sum += mid/times[i];
            }

            if(sum>=n){
                if(mid < answer){
                    answer = mid;
                }
                right = mid - 1;
            } 
            else left = mid + 1;
            
        }

        return answer;
    }
}

 

728x90

+ Recent posts