1. 문제 개요
오늘은 백준 시간 계산 문제 중에서 시, 분, 초 단위로 시간 차이를 구하는 문제를 풀었다.
13223번 - 소금 폭탄
단순한 시간 출력 문제가 아니라, 현재 시각과 알람 시각 사이의 남은 시간을 계산해야 한다.
특히 알람 시각이 현재 시각보다 이르면 다음날 시각으로 처리해야 하는 점이 핵심이다.
2. 핵심 개념 정리
시간 계산은 자바에서 LocalTime과 Duration 클래스를 사용하면 간단하게 처리할 수 있다.
- LocalTime.parse()를 이용해 "HH:MM:SS" 문자열을 시간 객체로 변환
- Duration.between(time1, time2)를 사용하면 두 시간 사이의 초(second) 차이를 구할 수 있다
- 초 단위 차이를 다시 시/분/초로 환산해 출력한다
단, 현재 시각이 알람 시각보다 이후인 경우, 하루를 넘겨서 계산해야 하기 때문에 직접 계산해줘야 한다.
if (now.equals(alarm)) {
System.out.println("24:00:00");
} else if (now.isBefore(alarm)) {
Duration diff = Duration.between(now, alarm);
} else {
Duration diff = Duration.between(now, LocalTime.MAX.plusSeconds(1))
.plus(Duration.between(LocalTime.MIDNIGHT, alarm));
}
시간을 초로 환산한 뒤 시/분/초로 다시 나누는 방식
long seconds = diff.getSeconds();
long h = seconds / 3600;
long m = (seconds % 3600) / 60;
long s = seconds % 60;
3. 백준 13223번 - 소금 폭탄
문제 설명
현재 시각과 알람 시각이 주어졌을 때,
현재 시각부터 알람 시각까지 남은 시간을 HH:MM:SS 형식으로 출력한다.
단, 알람 시각이 현재 시각보다 빠르다면 다음날 시각으로 간주해야 한다.
예시 입력
20:00:00
04:00:00
예시 출력
08:00:00
import java.time.Duration;
import java.time.LocalTime;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
LocalTime now = LocalTime.parse(sc.nextLine());
LocalTime alarm = LocalTime.parse(sc.nextLine());
Duration diff;
if (now.equals(alarm)) {
System.out.println("24:00:00");
return;
}
if (now.isBefore(alarm)) {
diff = Duration.between(now, alarm);
} else {
diff = Duration.between(now, LocalTime.MAX.plusSeconds(1))
.plus(Duration.between(LocalTime.MIDNIGHT, alarm));
}
long seconds = diff.getSeconds();
long h = seconds / 3600;
long m = (seconds % 3600) / 60;
long s = seconds % 60;
System.out.printf("%02d:%02d:%02d\n", h, m, s);
}
}
4. 배운 점 정리
- 자바의 LocalTime, Duration을 활용하면 시간 차이 계산이 훨씬 간결하고 명확해진다
- 시간 단위는 초로 환산한 뒤, 다시 시/분/초로 나누는 방식이 가장 깔끔하다
- LocalTime.MAX.plusSeconds(1)은 하루의 끝(23:59:59)을 넘기는 데 사용할 수 있다
- 시/분/초 처리를 직접 구현할 수도 있지만, 내장 클래스를 적극 활용하는 게 실무에서도 훨씬 유리하다
5. 같이 푼 문제들
11718번 - 그대로 출력하기
EOF(입력 종료)까지 주어지는 문자열을 그대로 출력하는 문제.
자바에서는 Scanner의 hasNextLine()을 사용해 해결한다.
Scanner sc = new Scanner(System.in);
while (sc.hasNextLine()) {
String line = sc.nextLine();
System.out.println(line);
}
핵심 개념: hasNextLine()
- 입력 스트림에 다음 줄이 존재하는지 여부를 반환
- EOF 기반 입력 처리에서 자주 사용됨
11654번 - 아스키 코드
문자 하나를 입력받아 해당 아스키 코드 값을 출력하는 문제.
char ch = sc.next().charAt(0);
System.out.println((int) ch);
- 'A' → 65, 'a' → 97, '0' → 48
- 문자와 정수 간의 형변환 기초를 익힐 수 있다
2525번 - 오븐 시계
현재 시각(시, 분)과 요리 시간(분)이 주어졌을 때,
조리 완료 후의 시각을 계산하는 문제. 시/분 연산을 수학적으로 구현한다.
int totalMin = hour * 60 + minute + cook;
int resultHour = (totalMin / 60) % 24;
int resultMin = totalMin % 60;
- 24시간 오버플로우를 % 24 연산으로 처리하는 게 포인트
- 초 단위는 없지만, 다음 시간 계산 문제들의 기반이 되는 문제다
6. 다음 목표
- 시간 계산 문제 흐름을 이어서 2530번 - 인공지능 시계 문제로 넘어갈 예정
- 점차 초 단위, 날짜 단위 계산, 시간 차이 응용으로 확장하며 정리할 계획이다
'코딩테스트' 카테고리의 다른 글
[코딩 테스트 문제 풀이 시리즈] 10431번 - 줄세우기: 직접 구현부터 삽입 정렬 개념까지 (2) | 2025.07.27 |
---|---|
자바 배열 문제 풀이 기록 (백준 1236 - 성지키기) (2) | 2025.07.25 |
알고리즘에서 꼭 나오는 시간복잡도 정리 (2) | 2025.07.23 |
자바 문자열 문제 풀이 기록 (백준 1543) (1) | 2025.07.22 |
자바 문자열 문제 풀이 기록 (백준 10808, 1157) (2) | 2025.07.21 |