https://school.programmers.co.kr/learn/courses/30/lessons/250135
시계에는 초침이 시침/분침과 겹칠 때마다 알람이 울리는 기능이 있습니다. 당신은 특정 시간 동안 알람이 울린 횟수를 알고 싶습니다.
알람이 울리는 횟수를 센 시간을 나타내는 정수 h1, m1, s1, h2, m2, s2가 매개변수로 주어집니다. 이때, 알람이 울리는 횟수를 return 하도록 solution 함수를 완성해주세요.
처음 풀이는 공식을 통해 매 시간, 분 단위로 겹치는 갯수를 구해서 값을 구하려 함 -> 생각보다 고려해야 할 조건이 많아서 포기
0~23:59:59까지의 수를 계산해보니 생각보다 큰 수가 아니라 1초마다 계산하는 방식으로 변경
1. 시작과 끝나는 시간은 초단위로 변경
2. 시침은 1초당 1/120도, 분침은 1초당 0.1도 이동, 시침은 1초당 6도 이동
3. 처음에 0시 또는 12시인 경우 시-분-초침이 만나서 시작
4. 맨 처음 시, 분, 초침의 각도를 구한 후 1초 뒤 시, 분, 초침의 각도를 구한다.
4-1. 시침 각도 > 초침 각도 -> 1초뒤 시침 각도 <= 초침 각도면 시침과 초침이 만난 경우
4-2. 분침도 동일
4-3. 만약 시침, 분침, 초침이 같다면 -1을 한다.
def solution(h1, m1, s1, h2, m2, s2):
answer = 0
start_t = h1 * 3600 + m1*60 + s1 # 시작 시간
end_t = h2*3600 + m2*60 + s2 # 끝 시간
# 시작부터 만나는 경우
if start_t == 0 or start_t == 12*3600:
answer += 1
while start_t < end_t:
h_deg = start_t / 120 % 360 # 시침은 1초에 1/120
m_deg = start_t / 10 % 360 # 분침은 1초에 0.1도
s_deg = start_t * 6 % 360 # 시침은 1초에 6도
start_t += 1
# 각각 다음 각도를 구해서 이전 각도와 비교 후 answer을 더해준다
# 이때, 0도는 360으로 변경해준다.
hn = 360 if start_t / 120 % 360 == 0 else start_t / 120 % 360
mn = 360 if start_t / 10 % 360 == 0 else start_t / 10 % 360
sn = 360 if start_t * 6 % 360 == 0 else start_t * 6 % 360
# 이전 시침각이 더 작은데 1초 후 크거나 같으면 만난 것
if s_deg < h_deg and sn >= hn:
answer += 1
if s_deg < m_deg and sn >= mn :
answer += 1
# 시침-분침-초침이 동시에 겹치면 -1
if sn == hn and hn == mn:
answer -= 1
return answer
너무 복잡하게 생각하지 말자.
1초마다 각도를 구해 답을 구할 수 있는데 수식을 통해 찾으려다가 시간을 많이 소모함