2023. 9. 6. 09:33ㆍC++/알고리즘
https://school.programmers.co.kr/learn/courses/30/lessons/43238
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
이번 이분탐색 문제도 헤매다가 결국 힌트를 보고 깨달았는데...
심사 받는 사람의 수를 탐색하는 것이 아닌 소요되는 시간을 이분탐색으로 최대한 줄여나가면 된다.
이전에 풀었던 공유기 설치 문제와 동일한 방법이다.
https://djgameprogramming.tistory.com/117
공유기 설치(이분 탐색, 그리디)
https://www.acmicpc.net/problem/2110 2110번: 공유기 설치 첫째 줄에 집의 개수 N (2 ≤ N ≤ 200,000)과 공유기의 개수 C (2 ≤ C ≤ N)이 하나 이상의 빈 칸을 사이에 두고 주어진다. 둘째 줄부터 N개의 줄에는 집
djgameprogramming.tistory.com
최소 소요 시간을 1, 최대 소요 시간을 가장 오래 걸리는 심사관에게 모두 심사받는 시간으로 설정한다.
이 최솟값과 최댓값의 중간값을 구하여 해당 시간이 소요되었다고 할때 각 심사관마다 심사할 수 있는 사람의 수를 구한다.
이렇게 구한 사람의 수와 심사 받아야 할 사람의 수를 비교하여 이분탐색으로 중간값을 최대한 줄여나간다.
이분탐색 과정에서 무한루프에 빠지지 않도록 조건의 설정에 유의하도록 한다.
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
long long binary_search(long long front, long long end, int n, vector<int> times)
{
int ret = 0;
while (front < end)
{
long long mid = (front + end) / 2;
long long count = 0;
for (int time : times)
{
count += mid / (long long)time;
}
if (n <= count)
{
end = mid;
}
else
{
front = mid + 1;
}
}
return front;
}
long long solution(int n, vector<int> times)
{
sort(times.begin(), times.end());
long long max = (long long)times[times.size() - 1] * n;
long long answer = binary_search(1, max, n, times);
return answer;
}
'C++ > 알고리즘' 카테고리의 다른 글
풍선 터트리기(선형 탐색) (0) | 2023.09.18 |
---|---|
경주로 건설(DP) (0) | 2023.09.05 |
숫자 게임(BST) (0) | 2023.08.18 |
타일링(DP) (0) | 2023.08.16 |
수식 최대화(순열, 완전 탐색) (0) | 2023.08.08 |