[Algorithm] 이진탐색: 입국심사 (프로그래머스 Lv3)

task11·2022년 4월 22일
0

알고리즘뽀개기

목록 보기
13/20
post-thumbnail

💡 이진탐색으로 풀이, 프로그래머스 3단계

문제 🛫


입국심사

문제 참조 : https://programmers.co.kr/learn/courses/30/lessons/43238

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

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

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

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

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

TC
n times return
6 [7, 10] 28

분석

이진탐색을 이용하여 풀 수 있다.

  • 로그 시간만으로 끝내야하는 경우에 보통 이진 탐색밖에 사용하지 못한다.
  • 파라메트릭 서치

풀이 📖


Solution

function solution(n, times) {
  let left = 1;
  let right = Math.max(...times) * n;

  while (left <= right) {
    const mid = Math.floor((left + right) / 2);
    const sum = times.reduce((acc, time) => acc + Math.floor(mid / time), 0);

    if (sum < n) {
      left = mid + 1;
    } else {
      right = mid - 1;
    }
  }

  return left;
}

// TC
solution(6, [7, 10]);

분석(line by line)

코드 line마다 뜯어보기

function solution(n, times) {
  let left = 1;
  let right = Math.max(...times) * n; // TC: 60, Math.max() : O(n)
  // [1 ... 60] 까지의 배열이 있고, 이 안에 정답이 있다. 최적 값은 이진 탐색으로 찾아낸다.
  while (left <= right) {
    const mid = Math.floor((left + right) / 2);
    // acc += 심사위원당 볼 수 있는 사람 (시간 / 심사 시간)
    const sum = times.reduce((acc, time) => acc + Math.floor(mid / time), 0);
	
    // 심사위원당 볼 수 있는 사람이 총 사람보다 적으면 시간이 부족한거니까 left 값을 mid + 1로 올려버린다.
    if (sum < n) {
      left = mid + 1;
    }
    // 심사위원당 볼 수 있는 사람이 총 사람보다 많으면 시간이 남는거니까 right 값을 mid - 1로 내려버린다.
    else {
      right = mid - 1;
    }
  }
  // left랑 right랑 같아지면 mid랑도 값이 같은데, while문 끝자락에서 left에 +1을 해줬으니까, left를 반환하면 정답.
  return left;
}

Review 💡

파라메트릭 서치에 대한 이해도가 필요하다.

  • 특정 값을 찾는게 아닌 문제에서 이진 탐색으로 값을 선별해 내는 문제이다.(처음 풀어봤다.)
  • input 값의 크기에 따라 어떤 알고리즘을 적용할지 먼저 선택하는 방법도 좋은 것 같다.

0개의 댓글