안녕하세요. 회사와 함께 성장하고 싶은 KOSE입니다.
이번 포스팅은 백준 문자열 문제 - 경고 풀이를 진행하도록 하겠습니다.
문제 출처: https://www.acmicpc.net/problem/3029
1. 풀이 소스
import java.io.*
fun main() = BufferedReader(InputStreamReader(System.`in`)).use {
val startTime = readlnOrNull()?.timeToSeconds() ?: throw IllegalArgumentException()
val endTime = readlnOrNull()?.timeToSeconds() ?: throw IllegalArgumentException()
val result = when {
endTime - startTime <= 0 -> (endTime + 24 * 3600 - startTime).toTimeString()
else -> (endTime - startTime).toTimeString()
}
println(result)
}
fun String.timeToSeconds(): Int {
val (hour, minute, seconds) = this.split(":").map { it.toInt() }
return hour * 3600 + minute * 60 + seconds
}
fun Int.toTimeString(): String {
val hours = this / 3600
val minutes = (this % 3600) / 60
val seconds = this % 60
return String.format("%02d:%02d:%02d", hours, minutes, seconds)
}
2. 풀이 과정
- 확장 함수 사용
코틀린 확장함수를 사용하여 String, Int 등 기본 타입에 추가로 커스텀한 함수를 만들 수 있습니다.
timeToSeconds()라는 확장함수를 정의하여 시간, 분, 초를 초단위 정수로 변환하였습니다.
toTimeString()은 정수를 필요한 포맷인 00:00:00 형태로 바꿔주는 함수입니다.
만약 숫자를 그대로 출력하면 2자리가 아닌 한자리 숫자(ex 8)는 그대로 한자리가 됩니다.
String.format("%02d:%02d:%02d", hours, minutes, seconds)로 필요한 공백은 0으로 만들어서 리턴할 수 있습니다.
- when 사용
endTime - startTime이 0이하인 경우는 endTime에 24시간을 더 한 후 startTime에서 빼면 시간 차이를 구할 수 있습니다.
문제에서 최소 1초는 대기한다고 하였으므로 만약 startTime과 endTime이 시간이 같다면 endTime은 날짜가 하루 지난 것이라고 보아야 합니다.
이상으로 백준 경계 문제 풀이를 마치도록 하겠습니다.
감사합니다!
'Algorithm' 카테고리의 다른 글
[Algorithm] 백준 문자열 문제 - 디지털시계(1942) 코틀린 풀이 (0) | 2023.09.12 |
---|---|
[Algorithm] 백준 MST 문제 - 별자리 만들기(4386) 자바 풀이 (0) | 2023.05.24 |
[Algorithm] 백준 LIS 문제 - 가장 긴 증가하는 부분 수열 5(14003) 자바 풀이 (0) | 2023.05.24 |
[Algorithm] 백준 LCS 문제 - LCS 2(9252) 자바 풀이 (0) | 2023.05.24 |
[Algorithm] 백준 이분탐색 문제 - 공유기 설치(2110) 자바 풀이 (0) | 2023.05.24 |