이분탐색으로
left = 0;
right 는 최대 시간인 n*times.back(); 으로 주었다.
#include <string>
#include <vector>
#include <algorithm>
#include<iostream>
using namespace std;
long long solution(int n, vector<int> times) {
sort(times.begin(), times.end());
long long right = n*times.back();
long long left = 0;
long long mid = (right+left)/2;
long long premid = 0;
long long sum = 0;
while(premid != mid){
sum = 0;
premid = mid;
bool check = true;
for(int i=0; i<times.size(); i++){
sum += mid/times[i];
if(mid%times[i] == 0){
check = false;
}
}
if(sum>n){
right = mid;
}else if(sum==n&&check){ //3, [10,10,11] 이런경우를 잡아준다.
right=mid;
}else if(sum<n){
left = mid;
}
mid = (right+left)/2;
if(premid == mid&& sum < n){ //이부분이 3,[1,2,2] 이런경우를 잡아준다.
left = mid+1;
right = n*times.back();
mid = (right+left)/2;
}
}
return mid;
}
'알고리즘 일기' 카테고리의 다른 글
프로그래머스 : 순위 (0) | 2019.12.10 |
---|---|
프로그래머스: 여행경로 (0) | 2019.12.09 |
프로그래머스 : 디스크 컨트롤러 (0) | 2019.12.09 |
priority_queue 비교함수 만들기 (0) | 2019.12.09 |
프로그래머스 : 예산 (0) | 2019.12.08 |
댓글