문제
시작 시각부터 종료 시각까지 매초마다 HHMMSS를 이어붙인 6자리 수가 3의 배수인 횟수를 구하라. 3개의 테스트 케이스가 주어진다.
입력
3줄에 걸쳐 시작 시각과 종료 시각이 HH:MM:SS 형식으로 주어진다.
출력
각 케이스에 대해 3의 배수인 횟수를 출력한다.
예제
| 입력 | 출력 |
|---|---|
00:00:00 00:00:10 12:00:00 12:00:10 11:11:11 11:11:11 | 4 4 0 |
풀이
시각을 초 단위로 변환하여 순회하면서, HHMMSS 수가 3의 배수인지 확인한다.
- 시작/종료 시각을 초 단위로 변환한다 (H3600 + M60 + S)
- 종료가 시작보다 작으면 24시간(86400초)을 더한다
- 각 초에 대해 HHMMSS 형태의 수로 변환하여 3의 배수인지 확인한다
- 3의 배수이면 카운트를 증가시킨다
핵심 아이디어: 하루는 최대 86400초이므로 모든 초를 순회해도 O(1) 상수 시간이다.
코드
def realtime(h, m, s):
return 3600 * h + 60 * m + s
def tentime(val):
return 10000 * (val // 3600) + 100 * ((val % 3600) // 60) + val % 60
for i in range(3):
a, b = input().split()
answer = 0
dataa = list(map(int, a.split(":")))
datab = list(map(int, b.split(":")))
vala = realtime(*dataa)
valb = realtime(*datab)
if vala > valb:
valb += realtime(24, 0, 0)
for i in range(vala, valb + 1):
if tentime(i) % 3 == 0:
answer += 1
print(answer)복잡도
- 시간: O(86400) = O(1) (최대 하루 초 수)
- 공간: O(1)