Algorithm/Algorithms Practice
[프로그래머스/C++] 입국심사
Patrick_
2023. 12. 19. 14:09
1. 개요
https://school.programmers.co.kr/learn/courses/30/lessons/43238
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
1-1. 설명
n명이 입국 심사를 위해 줄을 서서 기다리고 있다. 각 입국 심사대에 있는 심사관마다 심사하는데 걸리는 시간은 다르다. 처음 시작 시, 모든 심사대는 비어있으며, 한 심사대에 한 명만 심사가 가능하다. 모든 사람이 심사를 받는데 걸리는 시간을 최소로 하는 함수를 구현한다.
1-2. 제한 사항
- 입국 심사를 기다리는 사람 수 n은 1 이상 1,000,000,000 이하 자연수
- 각 심사관이 한명을 심사하는데 걸리는 시간 배열은 times, 한 명을 심사하는데 걸리는 시간은 1 이상 1,000,000,000 이하 자연수
- 심사관은 1 이상 100,000 이하
2.구현
2-1. 풀이
이분 탐색 문제이나, 기준을 어디서 둬야할 지 살짝 헤맸었다. times를 기준으로 두지말고 [1 ~ 모두 검사하는데 걸리는 최대시간]을 기준으로 이분 탐색을 진행하며 n명 이상이 걸리는 시간의 최솟값을 반환하면 된다.
2-2. 코드
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
long long minimumTime;
long long BinarySearch(long long first, long long last, int n, vector<int> times);
long long solution(int n, vector<int> times) {
minimumTime = 0;
sort(times.begin(), times.end());
long long answer = BinarySearch(1, n * (long long) times.back(), n, times);
return answer;
}
long long BinarySearch(long long first, long long last, int n, vector<int> times){
if (first > last) return minimumTime;
long long mid = (first + last) / 2;
// mid : 심사를 받는데 걸리는 시간
long long count = 0;
for (long long time : times) count += (mid / time);
// mid 시간 기준 몇 명의 인원이 처리되었는지 확인
if (count >= n) {
minimumTime = mid;
return BinarySearch(first, mid - 1, n, times);
}
else return BinarySearch(mid + 1, last, n, times);
}