안녕하세요. 회사와 함께 성장하고 싶은 KOSE입니다.

이번 포스팅은 백준 문자열 문제 - 경고 풀이를 진행하도록 하겠습니다.

 

문제 출처: https://www.acmicpc.net/problem/3029

 

3029번: 경고

첫째 줄에 현재 시간이 hh:mm:ss 형식으로 주어진다. (시, 분, 초) hh는 0보다 크거나 같고, 23보다 작거나 같으며, 분과 초는 0보다 크거나 같고, 59보다 작거나 같다. 둘째 줄에는 나트륨을 던질 시간

www.acmicpc.net

 

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은 날짜가 하루 지난 것이라고 보아야 합니다.

 

이상으로 백준 경계 문제 풀이를 마치도록 하겠습니다.

감사합니다!

+ Recent posts