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

박지예·2023년 11월 4일
0

코딩테스트

목록 보기
16/17

문제

이분 탐색을 사용해야 하는 문제이다.
이분 탐색이 무엇인진 알지만 코딩테스트에서는 전혀 응용하지 못하겠다..

결국 블로그를 참고하여 풀이 방법을 이해하려 노력했다.
블로그

현재시간(mid) / time[i] 를 모두 더한 값으로 현재 시간동안 몇명을 처리했는지 알 수 있다.

    public long solution(int n, int[] times)
    {
        long answer = 0;

        Array.Sort(times); 
        long[] t = Array.ConvertAll(times,val => (long)val);

        long start = 1;                 // 시작 인덱스 
        long end = (long)n * t[0];      // 종료 인덱스 (정렬해 두었기 떄문에 가장 작은, 심사를 가장 빨리 끝낼 수 있는 t 값 * 사람 수로 시작) 
        answer = end;                   // 일단 최대 시간으로 설정
        long mid = 0;

        while(start <= end)
        {
            mid = (start + end) / 2;            //중간값 (이분탐색)

            long pCnt = 0;
            for (int i = 0; i < t.Length; i++)
            {
                pCnt += mid / t[i];
            }

            if(pCnt < n)                // 통과한 사람 수 가 답(n)보다 적은 경우 
            {
                start = mid + 1;        // 시작은 현재 중간값보다 높아야 한다! + 1
            }
            else
            {
                answer = mid;           // 정답일 수 도 있다. 
                end = mid - 1;          // 종료 값을 더 줄일 수 있다! 
            }
        }

        return answer;
    }
profile
언젠간 바다로 갈거야!🐋

0개의 댓글