본문 바로가기
카테고리 없음

99클럽 코테 스터디 22일차 TIL + [프로그래머스] 입국심사 JAVA 풀이/이분탐색

by 푸딩코딩 2024. 6. 10.
728x90
반응형

 

 

 

 

 

 

1. 오늘의 학습 키워드


 

[프로그래머스] 입국심사 JAVA 풀이

이분탐색

 

 

2. 오늘의 학습 문제 


문제


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

 

프로그래머스

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

programmers.co.kr

 

 

 

코드


import java.util.*;

class Solution {
    public long solution(int n, int[] times) {
        Arrays.sort(times);
        
        //left는 0, right는 최대시간, mid는 right로 초기 세팅한다
        long left=0; 
        long right=  (long) times[times.length-1] * n ; // 최악의 경우, 배열이니까 length
        long mid ;
        long answer= right ;
        
        while(left<=right){ //이진탐색
            mid=(left+right) / 2; //중간값
            long entryPeople= calcuEntry( mid, times); //mid시간일때 통과한 사람들
            
            
            if (entryPeople >= n) {
                answer = mid;
                right = mid - 1;
            } else {
                left = mid+1 ;
            }
            
        }
        
        return answer;
        
    }
    
    static private long calcuEntry(long mid, int[]times){ //mid시간을 times 요소들로 나눈 값을 더했을 때, 몇명인지 반환
        
        long sum=0;
        for(int time:times){
            sum+= mid/time ;
        }
        return sum;
        
    }
}

 

이분탐색을 이용해서 푸는 문제. 

최소 시간을 구하는 방법은, 설정한 시간에 대해 times 안에 있는 요소들을 모두 나눈 값의 합이 n이 되는 지점에서 최소를 구한다. 

left=0, right는 최악의 시간이 걸리는 경우를 고려해, times를 sort하여 가장 큰 수 *n으로 설정했다. 

이진탐색을 하며, mid를 갱신하고, calcuEntry함수는 시간에 대해 통과하는 사람 수를 반환한다. 

그 값 entryPeople 가 n보다 크거나 같으면 answer를 mid로 갱신하고 right를 mid-1로 줄여준다. 

그렇지않다면, left를 mid+1로 갱신하여 이분탐색

left>right에서 이분 탐색 종료하고, answer리턴 

 

 

 

3. 오늘의 회고


  • 이분 탐색을 적용하여 문제를 풀 수 있었고, 어디에 적용해야할지 고민하는데 시간이 걸렸다.
  • 숫자적으로 최소값이 아닌, 어떤 조건에 대해 최소값을 찾을 때 이분탐색을 응용해보자 .
  • left = mid+ 1, right= mid-1이다. 1을 더하고 빼주는 이유는 오버플로우-무한루프를 방지하기 위해서다! 
  • long은 정수형, 10억 *   10만은 21억 이상이기 때문에 long을 사용했다. 자료의 타입도 잘 고려하자.

 

 

728x90
반응형