GitHubSeob
C++ / 프로그래머스 / 입국심사 본문
문제
https://school.programmers.co.kr/learn/courses/30/lessons/43238
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제풀이
선입 선출 스케줄링 문제를 풀고 나니까 쉬웠다. 똑같이 파라메트릭 서치로 풀면 된다.
선입 선출 스케줄링에서는 작업을 시작하는 부분을 구해야 했지만, 이 문제는 끝나는 부분을 구하면 된다.
주의할 점은 범위이다, 최대범위가 1,000,000,000 * 1,000,000,000이므로 long long형을 쓴다.
문제에 있는 예시를 보자. n = 6, times = [7, 10], answer = 28
7분이 걸리는 심사대에 4명, 10분이 걸리는 심사대에 2명이 가야 한다.
7*4 = 28, 10*2 = 20 이렇게 해서 답이 28이 나온 것이다.
나눗셈을 하고 몫을 더해서 n이 되는 값을 구하는 것이다.
if (cnt < n) {
left = mid + 1;
}
else {
right = mid - 1;
}
만약 cnt가 n이라면 left와 right 범위 안에 답이 있다는 뜻이다.
최솟값을 구해야 하므로 right를 움직여야 한다.
right를 움직이다 정답을 지나칠 수 있으므로 while의 조건을 left <= right로 잡았고, left를 return 했다.
코드
#include <string>
#include <vector>
#include <algorithm>
#define MAX 1000000000000000000
using namespace std;
long long solution(int n, vector<int> times) {
long long left(0), right(MAX), mid(0), idx(0), cnt(0);
while (left <= right) {
mid = (left + right) / 2;
cnt = 0;
for (idx = 0; idx < times.size(); ++idx) {
cnt += mid / times[idx];
}
if (cnt < n) {
left = mid + 1;
}
else {
right = mid - 1;
}
}
return left;
}
'Programmers > Level 3' 카테고리의 다른 글
C++ / 프로그래머스 / 순위 (0) | 2023.07.02 |
---|---|
C++ / 프로그래머스 / 합승 택시 요금 (0) | 2023.07.02 |
C++ / 프로그래머스 / 선입 선출 스케줄링 (0) | 2023.06.29 |
C++ / 프로그래머스 / 카운트 다운 (0) | 2023.06.28 |
C++ / 프로그래머스 / 억억단을 외우자 (0) | 2023.06.27 |