_DoYun
_yunilog
_DoYun
전체 방문자
오늘
어제
  • 전체 (83)
    • spring boot main 프로젝트 해결 (2)
    • 회고 (0)
      • pre-project(stackoverflow) (0)
    • 지식창고 (25)
    • 후기 (1)
    • LINUX (2)
    • HTML&CSS (2)
    • SQL (2)
    • 기술 면접 질문지 (1)
      • Chapter1 (1)
      • Chapter2 (0)
    • JAVA (25)
      • JAVA 기초 문법 (1)
      • Collection (1)
      • Enum,Annotation,Stream,람다 (3)
      • 입출력, Thread, JVM (1)
      • Spring Framework (3)
      • Spring MVC (6)
      • JPA (1)
      • Test (3)
      • API 문서 (1)
      • 인증&보안 (2)
      • AWS (2)
    • 알고리즘 (19)
      • 프로그래머스_LEVEL_3 (6)
      • 백준 (0)
      • 프로그래머스_LEVEL_2 (13)
    • Comento (2)
    • Inflearn (2)
      • HTTP (2)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
_DoYun

_yunilog

알고리즘/프로그래머스_LEVEL_3

[프로그래머스] 입국심사 (이분탐색)-JAVA

2022. 5. 11. 17:52

[문제 설명]

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

 

처음에 모든 심사대는 비어있습니다. 한 심사대에서는 동시에 한 명만 심사를 할 수 있습니다. 가장 앞에 서 있는 사람은 비어 있는 심사대로 가서 심사를 받을 수 있습니다. 하지만 더 빨리 끝나는 심사대가 있으면 기다렸다가 그곳으로 가서 심사를 받을 수도 있습니다.

 

모든 사람이 심사를 받는데 걸리는 시간을 최소로 하고 싶습니다.

 

입국심사를 기다리는 사람 수 n, 각 심사관이 한 명을 심사하는데 걸리는 시간이 담긴 배열 times가 매개변수로 주어질 때, 모든 사람이 심사를 받는데 걸리는 시간의 최솟값을 return 하도록 solution 함수를 작성해주세요.

 

[제한 사항]

  • 입국심사를 기다리는 사람은 1명 이상 1,000,000,000명 이하입니다.
  • 각 심사관이 한 명을 심사하는데 걸리는 시간은 1분 이상 1,000,000,000분 이하입니다.
  • 심사관은 1명 이상 100,000명 이하입니다.

[풀이]

문제에서 어려웠던 점은 최대한 빨리 모든 n이 입국심사를 끝내도록 하는 점이었는데, 입출력 예시를 보면 조금 더 이해하기 편할 것 같다. 

 

더보기

[입출력 예시]

 

n times return
6 [7,10] 28

 

 위와 같은 예제가 있을 떄,

 

가장 첫 두 사람은 바로 심사를 받으러 갑니다.

 

7분이 되었을 때, 첫 번째 심사대가 비고 3번째 사람이 심사를 받습니다.

 

10분이 되었을 때, 두 번째 심사대가 비고 4번째 사람이 심사를 받습니다.

 

14분이 되었을 때, 첫 번째 심사대가 비고 5번째 사람이 심사를 받습니다.

 

20분이 되었을 때, 두 번째 심사대가 비지만 6번째 사람이 그곳에서 심사를 받지 않고 1분을 더 기다린 후에 첫 번째 심사대에서 심사를 받으면 28분에 모든 사람의 심사가 끝납니다.


위의 예시처럼 마지막 사람이 남았을 때, 20분에 빈 자리가 있었던 10 times의 심사대로 보내는 것이 아니라 궁극적으로 보다 효율적인 7 times 심사대로 보낼 수 있게 만드는 것이 key point 같다. 

 

제한 사항의 값들이 매우 높기 때문에 처음부터 이분 탐색으로 문제를 해결하고자 했다. 그러나 이분 탐색으로 방향 잡아도 문제를 해결하는 것이 쉽지 않았는데, 다른 사람들의 코드를 참고한 결과, 생각의 전환으로 return 해야할 전체 시간에 각각 times 값들이 얼마나 필요한지 생각하면 어렵지 않게 풀 수 있었다.


import java.util.*;
class Solution {
    public long solution(int n, int[] times) {
        Arrays.sort(times);
        
        long start =0;
        long end = (long)n*(times[times.length-1]);

        long answer=0;

        while(start<=end){

            long mid = (start+end)/2;
            
            long sum=0;
            for (int i = 0; i < times.length; i++) {
                sum += mid / times[i];
            }

            if(sum<n){
                start = mid+1;
            }else{
                end=mid-1;
                answer=mid;
            }
        }
        return answer;
    }
}

'알고리즘 > 프로그래머스_LEVEL_3' 카테고리의 다른 글

[프로그래머스] 네트워크 (깊이/너비 우선 탐색)-JAVA  (0) 2022.05.20
[프로그래머스] 정수 삼각형 (Dynamic Programming)-JAVA  (0) 2022.05.19
[프로그래머스] 디스크 컨트롤러 (Heap)-JAVA  (0) 2022.05.19
[프로그래머스] N으로 표현 (Dynamic Programming)-JAVA  (0) 2022.05.10
[프로그래머스] 파괴되지 않은 건물 (2022 KAKAO BLIND RECRUITMENT)-JAVA  (0) 2022.04.29
    '알고리즘/프로그래머스_LEVEL_3' 카테고리의 다른 글
    • [프로그래머스] 정수 삼각형 (Dynamic Programming)-JAVA
    • [프로그래머스] 디스크 컨트롤러 (Heap)-JAVA
    • [프로그래머스] N으로 표현 (Dynamic Programming)-JAVA
    • [프로그래머스] 파괴되지 않은 건물 (2022 KAKAO BLIND RECRUITMENT)-JAVA
    _DoYun
    _DoYun

    티스토리툴바