미숙한 블로그 주인이 코딩테스트 문제를 풀어가는 과정을 담은 글입니다. 이 풀이가 효율적인 풀이가 아닐 수 있으며, 부정확한 정보가 많이 있을 수 있습니다. 보완해야할 점이 있다면 댓글로 남겨주세요!
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명 이하입니다.
풀이
입출력 예시
풀이
입국 심사에 걸리는 시간은 최악의 경우, 심사에 가장 오래 걸리는 심사관 x n이다. 이 값을 high로, 0을 low로 해서 이분탐색을 진행해 답을 구해야한다.
low와 high의 값이 바뀌는 기준을 지정해줘야한다. 이 기준은, low와 high의 중앙값인 mid를 times 배열에 있는 수로 나눈 몫을 더한값 count로 지정했다. 이것의 의미는, 중앙값 mid의 시간동안 각 심사관이 처리할 수 있는 사람의 수를 더한 것이다. 이 값을 기준으로 low와 high를 변환시켜 나가면 된다.
#include <vector>
#include <algorithm>
using namespace std;
long long solution(int n, vector<int> times) {
long long high;
long long low = 0;
long long mid;
high = (long long)*max_element(times.begin(), times.end());
high *= n;
while (true) {
if (high == low) {
return high;
}
mid = (high + low) / 2;
long long count = 0;
for (int i = 0; i < times.size(); i++) {
count += mid / times[i];
}
if (count >= n) {
high = mid;
}
else {
low = mid + 1;
}
}
}
'코딩 테스트(Coding test) > Lv. 3' 카테고리의 다른 글
[프로그래머스/C++] 단어 변환 (0) | 2022.05.17 |
---|---|
[프로그래머스/C++] 네트워크 (0) | 2022.05.17 |
[프로그래머스/C++] 여행경로 (0) | 2022.05.09 |
[프로그래머스/C++] 이중우선순위큐 (0) | 2022.05.08 |
[프로그래머스/C++] 하노이의 탑 (0) | 2022.05.05 |