본문 바로가기
Beakjoon&프로그래머스/Java

[백준/Java] 31416번 가상 검증 기술

by 현장 2026. 3. 6.

-Code

import java.io.*;
import java.util.*;

public class BOJ31416 {
    public static void main(String[] args) throws IOException {
        BufferedReader br =
                new BufferedReader(new InputStreamReader(System.in));

        int testCase = Integer.parseInt(br.readLine());

        for (int test = 0; test < testCase; test++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            int t_a = Integer.parseInt(st.nextToken());
            int t_b = Integer.parseInt(st.nextToken());
            int v_a = Integer.parseInt(st.nextToken());
            int v_b = Integer.parseInt(st.nextToken());

            int bTestTime = t_b * v_b;
            int aTestTime = t_a * v_a;
            if (aTestTime > bTestTime) {
                // 도훈이 오기전 상훈이가 끈낸 테스트 갯수
                int doneATest = bTestTime / t_a;
                int sanghunTime = doneATest * t_a;
                int dohunTime = bTestTime;
                // 남은 과제의 갯수
                int remainA = v_a - doneATest;
                // 남은 과제 수행
                for (int i = 0; i < remainA; i++) {
                    if (sanghunTime + t_a <= dohunTime + t_a) {
                        sanghunTime += t_a;
                    } else {
                        dohunTime += t_a;
                    }
                }
                System.out.println(Math.max(sanghunTime, dohunTime));
            } else {
                // b가 더 크거나 같은 경우는 같이 작업하는 경우가 없음 
                System.out.println(bTestTime);
            }
        }

        br.close();
    }
}

처음에 b테스트 타임을 구하고 이후 그 시간의 차이만큼을 구해 바로 동시에 a 테스트를 진행하는 방식으로 구하려 했으나 이러면 계산을 안 해야 하는 경우에도 계산을 하게 되었습니다. 그래서 a 테스트가 남아 있는 경우 계산을 하도록 했고 그 과정에서 상훈이가 b테스트가 끝났을 때 진행하고 있는 경우에 대해 생각하다 로직이 꼬여서 힌트를 찾아봤습니다.

그 결과 그냥 for문으로 남은 테스트만큼 확인을 하는데 테스트 후 시간을 2개 비교해서 상훈이 작거나 같으면 상훈에 더해주고 아니면 도훈에 더해주었습니다. 그 결과 중 최댓값이 모든 테스트를 끝낸 경우이므로 해당 값을 출력해 주면 되었습니다.