문제출저 :
https://programmers.co.kr/learn/courses/30/lessons/86053
코딩테스트 연습 - 금과 은 운반하기
어느 왕국에 하나 이상의 도시들이 있습니다. 왕국의 왕은 새 도시를 짓기로 결정하였습니다. 해당 도시를 짓기 위해서는 도시를 짓는 장소에 금 a kg과 은 b kg이 전달되어야 합니다. 각 도시에는
programmers.co.kr
소스코드 :
/*
a : 필요한 금
b : 필요한 은
g : i번 도시가 보유한 금
s : i번 도시가 보유한 은
w : i번 트럭이 옮길 수 있는 양
t : i번 트럭의 편도 운행시간
1e9 = 1 * 10의 9승
옮겨야 할 금의 양 = 10의 9승
옮겨야 할 은의 양 = 10의 9승
총 옮겨야 할 양 = 2 * 10의 9승
한 번에 옮길 수 있는 양 = 1
한 번 움직이는데 걸리는 시간 10의 5승
최대한 오래 걸리는 시간 = (2 * 10의 9승) / 1 * (2 * 10의 5승)
1. 주어진 시간 내에 옮길 수 있는 금의 양
2. 주어진 시간 내에 옮길 수 있는 은의 양
3. 주어진 시간 내에 옮길 수 있는 전체 양
*/
import java.util.*;
class Solution {
public long solution(int a, int b, int[] g, int[] s, int[] w, int[] t) {
long answer = -1;
long start = 0;
long end = (long)(1e9 * 2 * 1e5 * 2); // 최대한 오래걸리는 시간
while(start <= end)
{
long mid = (start + end) / 2;
long gold = 0;
long silver = 0;
long all = 0;
for(int i = 0; i < s.length; i++)
{
long nowG = g[i];
long nowS = s[i];
long nowW = w[i];
long nowT = t[i];
long move = mid / (nowT * 2);
// 편도 시간이 한 번 더 갈 수 있다면 +1, 마지막은 복귀할 필요가 없으므로
if(mid % (nowT * 2) >= t[i]) move++;
// i번째 도시의 금의 양과 전체 가져갈 수 있는 금의 양을 비교해서 작은 것을 선택해 저장
gold += Math.min(nowG, nowW * move);
silver += Math.min(nowS, nowW * move);
all += Math.min(nowG + nowS, nowW * move);
}
if(gold >= a && silver >= b && all >= a + b)
{
end = mid - 1;
answer = mid;
}
else
{
start = mid + 1;
}
}
return answer;
}
}