문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/250135
input : 시작 시점의 시간, 끝 시점의 시간
output : 시작 시간부터 끝나는 시간까지 아날로그 시계가 동작하는 동안 초침이 분침 혹은 시침과 만나는 횟수 반환
초침 > 분침 > 시침 순으로 움직이는 속도가 다릅니다.
초침이 제일 빠르고 1분에 한바퀴 도니까 그냥 1분에 2번씩 울리는거 아닌가? 라고 생각할 수 있지만, 다음을 주의해야 합니다.
초침, 분침, 시침이 시간단위별로 몇도씩 움직이는지 확인해봅시다.
시간, 분, 초가 input으로 주어졌을 때, 12시를 기준으로 시침, 분침, 초침이 몇도를 이루고 있는지 구하여 반환하는 함수를 이용했습니다.
이 함수를 이용해 매초마다 각도를 계산해서, 초침이 분침 혹은 시침의 각도를 추월한 경우 alarm_count를 1씩 증가하는 방식으로 문제를 해결했습니다.
from typing import Tuple
def find_angles(h: int, m: int, s: int) -> Tuple[float, float, float]:
s_ang = float(s * 6)
m_ang = float(m * 6 + s * 0.1)
h_ang = float((h % 12) * 30 + m * 0.5 + s / 120)
return (h_ang, m_ang, s_ang)
def solution(h1, m1, s1, h2, m2, s2):
alarm_count = 0
p_h_ang, p_m_ang, p_s_ang = find_angles(h1, m1, s1)
p_h, p_m, p_s = h1, m1, s1
if p_h_ang == p_m_ang == p_s_ang: # 시작 시점이 12시 정각인 경우
alarm_count += 1
# 초와 각도를 증가시키는 while 문
while True:
# 1초씩 증가
n_s = (p_s + 1) % 60
n_m = (p_m + (p_s + 1) // 60) % 60
n_h = (p_h + (p_m + (p_s + 1) // 60) // 60) % 24
n_h_ang, n_m_ang, n_s_ang = find_angles(n_h, n_m, n_s)
# 초의 각도가 분의 각도를 추월하는 순간 알림 카운트
if (p_s_ang < p_m_ang and n_s_ang >= n_m_ang) or (p_s_ang < p_m_ang and n_s_ang == 0.0):
alarm_count += 1
# 초의 각도가 시의 각도를 추월하는 순간 알림 카운트
if (p_s_ang < p_h_ang and n_s_ang >= n_h_ang) or (p_s_ang < p_h_ang and n_s_ang == 0.0):
alarm_count += 1
# 12시 정각인 경우 count -= 1
if n_h_ang == n_m_ang == n_s_ang: # 시작 시점이 12시 정각인 경우
alarm_count -= 1
if n_h == h2 and n_m == m2 and n_s == s2:
break
p_h, p_m, p_s = n_h, n_m, n_s
p_h_ang, p_m_ang, p_s_ang = n_h_ang, n_m_ang, n_s_ang
return alarm_count
input_1 = [0, 5, 30, 0, 7, 0]
input_2 = [12, 0, 0, 12, 0, 30]
input_3 = [0, 6, 1, 0, 6, 6]
input_4 = [11, 59, 30, 12, 0, 0]
input_5 = [11, 58, 59, 11, 59, 0]
input_6 = [0, 0, 0, 23, 59, 59]
print(f'answer : {solution(*input_5)}')
'''
입출력 예시
h1 m1 s1 h2 m2 s2 result
0 5 30 0 7 0 2
12 0 0 12 0 30 1
0 6 1 0 6 6 0
11 59 30 12 0 0 1
11 58 59 11 59 0 1
1 5 5 1 5 6 2
0 0 0 23 59 59 2852
'''