728x90
반응형
1. 오늘의 학습 키워드
[프로그래머스] 입국심사 JAVA 풀이
이분탐색
2. 오늘의 학습 문제
문제
https://school.programmers.co.kr/learn/courses/30/lessons/43238
코드
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
반응형