문제 : 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();
}
}
'PS > BOJ' 카테고리의 다른 글
백준 1337 자바 - 올바른 배열 (boj 1337 java) (0) | 2022.04.03 |
---|---|
백준 18868 자바 - 멀티버스 Ⅰ(boj 18868 java) (0) | 2022.04.02 |
백준 1187 자바, C++ - 숫자 놀이 (boj 1187 java c++) (0) | 2022.04.01 |
백준 5419 자바 - 북서풍 (boj 5419 java) (0) | 2022.03.31 |
백준 1918 자바 - 후위 표기식 (boj 1918 java) (2) | 2022.03.31 |
댓글