문제 출처 : https://www.acmicpc.net/problem/1942
언어 : Kotlin
문제 설명 :
디지털시계는 일반적으로 시각을 “hh:mm:ss”의 형태로 표현한다. hh는 00 이상 23 이하의 값을, mm과 ss는 00 이상 59 이하의 값을 가질 수 있다. 이러한 형태의 시각에서 콜론(“:”)을 제거하면 “hhmmss”라는 정수를 얻을 수 있는데, 이러한 정수를 시계 정수라고 한다. 예를 들어, 오후 5시 5분 13초, 즉 17:05:13의 시계 정수는 170513이고, 오전 0시 7분 37초, 즉 00:07:37의 시계 정수는 737이다.
이 문제에서 시간이란 시각의 구간을 나타낸다. 예를 들어 [00:59:58, 01:01:24]와 같이 시작하는 시각과 끝나는 시각으로 이루어진 구간을 우리는 시간이라고 부른다. (이러한 구간에는 시작하는 시간과 끝나는 시간도 포함된다)
이렇게 시간이 구간으로 주어지면, 그 구간에 포함되는 시계 정수들을 나열할 수 있다. 예를 들어 [00:59:58, 01:01:24]에 포함되는 시계 정수는 5958, 5959, 다음으로 10000 이상 10059 이하, 마지막으로 10100 이상 10124 이하로 총 87개가 된다. 우리는 이처럼 특정한 시간에 포함되는 시계 정수들 중, 3의 배수인 것이 몇 개나 있는지를 알고 싶다.
시간은 자정을 포함할 수도 있다. 즉 [23:59:03, 00:01:24]처럼 시작하는 시각의 시계 정수(235903)가 끝나는 시각의 시계 정수(124)보다 클 수도 있다. 물론 이 경우 이 구간에 포함되는 시계 정수는 235903 이상 235959 이하, 0 이상 59 이하, 100 이상 124 이하가 된다. 모든 구간이 포함하는 시간은 만 하루, 즉 24시간보다는 항상 작다고 가정해도 좋다.
시간이 시작하는 시각과 끝나는 시각으로 주어졌을 때, 이 구간에 포함되는 시계 정수들 중, 3의 배수인 것의 개수를 구하는 프로그램을 작성하시오.
입력 :
세 개의 입력이 주어진다. 첫째 줄부터 세 줄에 걸쳐 시작하는 시각과 끝나는 시각이 “hh:mm:ss”의 형태로 주어진다. 시작하는 시각과 끝나는 시각 사이에는 빈 칸이 하나 있어서, 한 줄마다 (빈 칸을 포함하여) 총 17글자가 입력으로 주어진다. 시작하는 시각과 끝나는 시각은 항상 다르다.
출력 :
첫째 줄부터 세 개의 줄에 걸쳐 입력된 구간에 포함되는 시계 정수들 중, 3의 배수인 것의 개수를 출력한다. 입력된 순서대로 각 줄에 한 개씩 차례로 출력하면 된다.
제한 사항 :
- 시간 제한 : 2초
- 메모리 제한 : 128MB
입출력 예 :
입력 | 출력 |
00:59:58 01:01:24 22:47:03 01:03:24 00:00:09 00:03:37 |
29 2727 70 |
풀이 :
입력받은 Start, End 시간을 초단위로 변환한다.
이후 반복문을 통해 Start 시간을 증가시키며 End 시간과 같아지면 빠져나온다.
이 반복문 내부에서 시간을 정수형으로 바꾸어 3의 배수인지 확인하고 맞다면 cnt를 증가시킨다.
만약 초단위의 시간이 최대치인 23:59:59를 넘어 24가 된다면 0시로 바꿔줘야 하므로 3600(1시간 = 60분 * 60초)
시간을 정수형으로 바꿀때, 10000, 100을 더하는 이유는 딱히 없다.
문자열 연결을 피하기 위해 존재한다. 즉, 단순히 시간 + 분 + 초를 더해서 다른 숫자가 나오는걸 방지하고 시간, 분, 초를 그대로 유지하며 같은 수학 연산을 수행시키기 위함이다.
https://stackoverflow.com/questions/3066586/get-string-in-yyyymmdd-format-from-js-date-object
import java.io.BufferedReader
import java.io.BufferedWriter
import java.io.InputStreamReader
import java.io.OutputStreamWriter
fun main() = with(BufferedReader(InputStreamReader(System.`in`))) {
val bw = BufferedWriter(OutputStreamWriter(System.out))
repeat(3) {
var cnt = 0
var (t1, t2) = readLine().split(" ").map {
val cur = it.split(":").map { it.toInt() }
cur[0] * 3600 + cur[1] * 60 + cur[2]
}
while (true) {
if (timeToInt(t1) % 3 == 0) cnt++
if (t1 == t2) break
t1++
t1 %= (3600 * 24)
}
bw.appendLine("$cnt")
}
bw.flush()
bw.close()
}
fun timeToInt(time: Int): Int {
var cur = time
val list = IntArray(3)
for (i in 0 until 3) {
list[i] = cur % 60
cur /= 60
}
return list[2] * 10000 + list[1] * 100 + list[0]
}
'백준 > 문제' 카테고리의 다른 글
3005번: 크로스워드 퍼즐 쳐다보기 (0) | 2024.06.13 |
---|---|
26004번: HI-ARC (0) | 2024.06.13 |
16113번: 시그널 (0) | 2024.06.12 |
27522번: 카트라이더: 드리프트 (0) | 2024.06.12 |
17214번: 다항 함수의 적분 (0) | 2024.06.11 |
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!