Developing Myself Everyday
 

프로그래머스

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

programmers.co.kr

문제 설명

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

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

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

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

 

제한사항

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

 

나의 풀이

이 문제는 이분 탐색을 이용해야 하는 문제이다. 주어진 시간의 최대값이 1,000,000,000분이기 때문에 시간을 하나하나 생각해서 적당한 시간을 찾는것은 힘들다. 그래서 이분탐색으로 조건을 만족하는 시간을 찾는 것이 가장 좋은 방법이다.

코드를 보면 알겠지만 복잡한 것은 생각보다 없다. 다만 이분탐색을 사용한다는 아이디어를 떠올리는 것이 매우 중요하다.

 

다만 주의할 점이 있는데 high의 최대값을 설정할 때 1,000,000,000으로 설정한다면 테스트 케이스 절반 정도를 실패하게 된다. 그 이유는 심사관이 한명을 심하는데 걸리는 시간은 최대 1,000,000,000이고 사람이 숫자가 1,000,000,000명이기 때문에 가능한 시간의 최대값이 1,000,000,000 * 1,000,000,000 이 나오게 된다.이점만 고려한다면 생각보다 금방 해결할 수 있는 문제이다.

 

class Solution {
    fun binarySearch(n: Int, times: IntArray): Long {
        var low = 1L
        var high = 1e18.toLong()

        while (low <= high) {
            val mid = (low + high) / 2

            if (check(n, times, mid)) {
                high = mid - 1
            } else {
                low = mid + 1
            }
        }

        return low
    }
    
    fun check(n: Int, times: IntArray, target: Long): Boolean {
        var cnt = 0L
        
        times.forEach {
            cnt += target / it
            
            if (cnt >= n) return true
        }
        
        return false
    }
    
    fun solution(n: Int, times: IntArray): Long =
        binarySearch(n, times.sorted().toIntArray())
}
profile

Developing Myself Everyday

@배준형

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!