Algorithm/프로그래머스 문제풀이

[프로그래머스] 금과 은 운반하기 - Java

너지살 2022. 5. 25. 20:55

 

문제출저 : 

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;
    }
}