
아래 프로그래머스 로고를 클릭하면 해당 문제로 이동합니다 😀
일단 시간을 전부 초 단위로 바꿔줬다.
1분 → 60초, 1시간→60분→3600초니까 시작시간과 끝나는 시간을 일단 초로 바꾸자.
그리고 나서 0시 0분 0초일때와 12시 0분 0초일때, 즉 시침 == 분침 == 초침일 경우를 따로 if문으로 체크해줬다.
그러면 이제 while문을 돌면서 시간을 1초씩 올려가며 체크하면 되는데 ...
일단 각도를 쓰는 문제라는걸 생각했으니 초침, 분침, 시침을 각도로 생각해보자.
초침은 360도를 60번 똑딱똑딱 하니까 360/60 = 6(d/s)
분침은 360도를 60번 똑딱똑딱 하니까 360/60 = 6(d/m) = 6/60 = 1/10(d/s)
시침은 360도를 12번 똑딱똑딱 하니까 360/12 = 30(d/h) = 30/60(d/m) = 1/120(d/s)이다.
현재 시간의 초침, 분침, 시침의 각도를 체크하고 1초가 지났을 때의 초침, 분침, 시침의 각도를 체크했다.
여기서 주의해야 하는 점은, 1초가 지났을 때 %360을 해서 0이 되는 경우가 생겨버려서 이 경우는 360으로 처리하게 코드를 작성했다.
1. 현재 초침의 각도가 시침의 각도보다 작고, 1초 후의 초침의 각도가 시침의 각도보다 클 경우, cnt += 1
2. 현재 초침의 각도가 분침의 각도보다 작고, 1초 후의 초침의 각도가 분침의 각도보다 클 경우, cnt += 1
3. 현재 초침의 각도와 분침의 각도와 시침의 각도가 모두 같은 경우, cnt -= 1
[1, 2번 조건]
현재 시침이 숫자 2에 가있을때 초침이 2에 코딱지만큼 못미쳤고,
1초 후의 시침이 숫자 2보다 코딱지만큼 넘어갔고 현재 시침은 숫자 2에서 개미코딱지만큼 움직인 그런 경우랄까 ?
예시가 좀 더럽긴 하지만 암튼 내가 이해한 방식이다..
[3번 조건]
위에서 1, 2번에 모두 걸렸을 경우 중복이 되기 때문에 제거해준다.
위 세개의 조건을 체크한 후 초를 하나 올려주면 된다.
def solution(h1, m1, s1, h2, m2, s2):
answer = 0
start_time, end_time = h1 * 3600 + m1 * 60 + s1, h2 * 3600 + m2 * 60 + s2
if start_time == 0 or start_time == 12 * 3600:
answer += 1
while start_time < end_time:
h_angle = start_time / 120 % 360
m_angle = start_time / 10 % 360
s_angle = start_time * 6 % 360
next_h_angle = 360 if (start_time + 1) / 120 % 360 == 0 else (start_time + 1) / 120 % 360
next_m_angle = 360 if (start_time + 1) / 10 % 360 == 0 else (start_time + 1) / 10 % 360
next_s_angle = 360 if (start_time + 1) * 6 % 360 == 0 else (start_time + 1) * 6 % 360
# 1초후에 초침이 시침을 넘어가면
if s_angle < h_angle and next_h_angle <= next_s_angle:
answer += 1
# 1초 후에 초침이 분침을 넘어가면
if s_angle < m_angle and next_m_angle <= next_s_angle:
answer += 1
if next_s_angle == next_m_angle == next_h_angle:
answer -= 1
start_time += 1
return answer
