본문 바로가기
PS/BOJ

백준 3029 자바 - 경고 (boj 3029 java)

by Nahwasa 2022. 4. 2.

문제 : boj3029

 

  H시간은 H*60*60초 이다. M분은 M*60초이다. S초는 S초이다. 따라서 입력으로 주어진 hh:mm:ss 두 개는 간단히 둘 다 00:00:00부터 몇 초 후인지로 변경할 수 있다.

 

  예를들어 다음의 예시를 보자. (예제 입력 2에서 위아래를 바꾼 예시이다.)

14:36:22
12:34:56

  이 때 현재 시간인 14:36:22는 52582초, 나트륨을 던질 시간인 12:34:56은 45296초가 된다. 전자를 st, 후자를 ed라고 해보겠다. 이 때 ed-st를 한다면 기다리는 시간을 알 수 있을 것이다. ed-st = -7286이 된다. 그 말인 즉, 나트륨을 던질 시간은 하루 뒤였다는 얘기이니 (현재 시간의 다음날 12:34:56) 24시간을 더해주면 된다. 즉, ed가 st보다 작다면 ed+24시간 - st를 해주면 된다(24*60*60을 더해주면 된다.). 그럼 최종적으로 79114초를 기다리면 됨을 알 수 있다.

 

  이제 그걸 다시 hh:mm:ss 형태로 변경해주면 된다. 다음과 같이 진행하면 된다.

  이 때 시간, 분, 초가 각각 10 미만이라면 앞에 0을 붙여서 2자리씩으로 출력해줘야 한다.

그리고 주의할 점이 있는데, 만약 입력의 두 시간이 동일하다면, '정인이는 적어도 1초를 기다리며, 많아야 24시간을 기다린다.' 라는 문제에서 제시된 조건에 따라 00:00:00을 출력해선 안되고 24:00:00을 출력해야 한다.

 

 

 

코드 : github

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
    private int convert(String time) {
        StringTokenizer st = new StringTokenizer(time, ":");
        int sec = 0;
        sec += Integer.parseInt(st.nextToken()) * 60 * 60;
        sec += Integer.parseInt(st.nextToken()) * 60;
        sec += Integer.parseInt(st.nextToken());
        return sec;
    }

    private void solution() throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String st = br.readLine();
        String ed = br.readLine();
        if (st.equals(ed)) {
            System.out.println("24:00:00");
            return;
        }
        int gap = convert(ed) - convert(st);
        if (gap < 0) gap += 24*60*60;
        int hour = gap/(60*60);
        gap %= 60*60;
        int min = gap/60;
        gap %= 60;
        int sec = gap;
        System.out.println(String.format("%s:%s:%s", ""+(hour<10?"0"+hour:hour), ""+(min<10?"0"+min:min), ""+(sec<10?"0"+sec:sec)));
    }

    public static void main(String[] args) throws Exception {
        new Main().solution();
    }
}

댓글