프로그래머스 3단계 입국심사 (C++)
핸드폰 하다 잘 거 같아서 그럴 바엔 문제 좀 풀라고 노트북 켰다.
프로그래머스 3단계 4문제를 50분만에 털다니....
반 년 넘게 매달린 보람이 있는 거 같기도 하고 ㅠㅠ
엄청난 발전이긴하다... 1년 더 빡세게 하면 나도 괴물이 될 수 있을까...?
문제링크
https://programmers.co.kr/learn/courses/30/lessons/43238
설명
아마 이분 탐색 문제는 당분간 업로드 하지 않을 거 같다.
이 문제도 이분 탐색이다. 이분 탐색은 기준을 잡는 것이 굉장히 중요하다.
이 문제에서의 기준은 시간이다.
시간을 줄이고 늘려가면서 그 시간 안에 몇 명의 사람들이 심사대를 통과할 수 있는 지 세어주고 많다면 시간을 줄여주고 적다면 시간을 늘려주면서 답을 구한다.
end를 나처럼 극단적으로 잡을 필요는 없고 times에서 가장 큰 값과 n을 곱한 값으로 설정해도 상관 없다.
오히려 저렇게 한다면 시간을 더 절약할 수 있다.
근데 이 부분에서 새로운 사실을 알아냈다. int * int로는 long long을 나타낼 수는 없지만 long long * int로는 long long을 나타낼 수 있다는 점이다! 설마 이거 기본인가...? 무지성 돌진한 나한테는 매우 신기한 사실이었다... 흠흠...
아직 이분 탐색 문제를 많이 풀지는 않았지만 지금까지 풀어 본 바로는 많이 어려운 문제가 아니라면 기준을 찾아내면 대부분 끝나는 거 같다.
코드
#include <vector>
#include <algorithm>
using namespace std;
long long solution(int n, vector<int> times) {
long long start = 0;
long long end = 1000000000000000000;
long long mcnt = end;
while (start <= end)
{
long long cnt = 0;
long long mid = (start + end) / 2;
for (int i = 0; i < times.size(); i++)
cnt += mid / times[i];
if (cnt >= n)
{
mcnt = min(mid, mcnt);
end = mid - 1;
}
else
start = mid + 1;
}
return mcnt;
}
Author And Source
이 문제에 관하여(프로그래머스 3단계 입국심사 (C++)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@ngchaneok/프로그래머스-3단계-입국심사저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)