다시 한번 조건을 정리해보자: a: 필요한 금의 무게 b: 필요한 은의 무게 새로운 도시의 수= 배열 요소의 개수 g: 배열당 운반 가능한 금의 무게 s: 배열당 운반 가능한 은의 무게 w: 최대 운반 가능한 무게 t: 각각의 도시마다 편도로 운반 가능한 시간 이 정보들을 토대로 a kg의 금, b kg의 은을 운반하는 최적의 시간을 result로 반환해야 한다.

이 조건들 아래에서는 운반 트럭이 왕복 그 이상의 거리를 운행해야 한다. 조건 1: 금의 무게 g가 최대 무게 w를 넘길 때? 조건 2: 은의 무게 s가 최대 무게 w를 넘길 때? 조건 3: 광물 각각은 편도로 옮길 수 있으나, 금 + 은의 (g+s) 무게가 최대 무게 w를 넘길 때? 이때에 한하여, t는 추가로 계산해야 한다는 뜻이다.

그리고 해당 t는 각 도시마다 걸리는 편도의 시간이기에, 모든 주어진 도시 (배열 요소당) t를 구해서 합해줘야 최적의 운반 시간을 구할 수 있다.

해당 문제는 이진 탐색을(Binary Search) 적용해야 최적값을 구하기 쉽다.

최소값 0을 left, 제한 사항 중 가장 큰 값인 1e9(10^9) 보다 높은 임의의 숫자를 right로 놓고 풀자. 참고로 이 문제의 최종 값은 매우 크므로 long long 자료형 변환을 잊지말자.

추가로 사용한 변수는 이진 탐색의 진행에 따라 합산해야 하는 값들이다. 현재 총 금의 무게 g의 합 totalGold, 현재 총 은의 무게 s의 합totalSilver, 현재 모든 광물의 무게 w의 합 totalWeight, 현재 운반에 걸린 편도 횟수trips,모든 편도 횟수 trips로 계산된 무게 w들의 현재 합 maxTransport

// 탐색 시작
while (left <= right) {
        long long mid = (left + right) / 2; //반으로 탐색 조건 줄이기
        long long totalGold = 0, totalSilver = 0, totalWeight = 0;

        for (int i = 0; i < g.size(); i++) {
            long long trips = mid / (2 * t[i]);  // 왕복 가능 횟수
            if (mid % (2 * t[i]) >= t[i]) trips++;  // 편도 운반 가능하면 추가

            long long maxTransport = trips * w[i]; // 이 도시의 최대 운반량
            totalGold += min((long long)g[i], maxTransport);  // long long로 타입 맞추기
            totalSilver += min((long long)s[i], maxTransport);  // long long로 타입 맞추기
            totalWeight += min((long long)(g[i] + s[i]), maxTransport);  // long long로 타입 맞추기
        }

        if (totalGold >= a && totalSilver >= b && totalWeight >= a + b) {
            answer = mid;
            right = mid - 1;
        } else {
            left = mid + 1;
        }
    }

문제의 조건을 잘못 이해하고, 최대 가능 시간을 주어진 가장 큰 값이었던 1e9의 시간을 right로 설정해서 오답이 발생했었다. 1e15로 테스트해보니 모든 케이스를 통과했다.