아날로그 시계(L2)
문제 설명
시침, 분침, 초침이 있는 아날로그시계가 있습니다. 시계의 시침은 12시간마다, 분침은 60분마다, 초침은 60초마다 시계를 한 바퀴 돕니다. 따라서 시침, 분침, 초침이 움직이는 속도는 일정하며 각각 다릅니다. 이 시계에는 초침이 시침/분침과 겹칠 때마다 알람이 울리는 기능이 있습니다. 당신은 특정 시간 동안 알람이 울린 횟수를 알고 싶습니다.
다음은 0시 5분 30초부터 0시 7분 0초까지 알람이 울린 횟수를 세는 예시입니다.
- 가장 짧은 바늘이 시침, 중간 길이인 바늘이 분침, 가장 긴 바늘이 초침입니다.
- 알람이 울리는 횟수를 세기 시작한 시각은 0시 5분 30초입니다.
- 이후 0시 6분 0초까지 초침과 시침/분침이 겹치는 일은 없습니다.
- 약 0시 6분 0.501초에 초침과 시침이 겹칩니다. 이때 알람이 한 번 울립니다.
- 이후 0시 6분 6초까지 초침과 시침/분침이 겹치는 일은 없습니다.
- 약 0시 6분 6.102초에 초침과 분침이 겹칩니다. 이때 알람이 한 번 울립니다.
- 이후 0시 7분 0초까지 초침과 시침/분침이 겹치는 일은 없습니다.
0시 5분 30초부터 0시 7분 0초까지는 알람이 두 번 울립니다. 이후 약 0시 7분 0.584초에 초침과 시침이 겹쳐서 울리는 세 번째 알람은 횟수에 포함되지 않습니다.
다음은 12시 0분 0초부터 12시 0분 30초까지 알람이 울린 횟수를 세는 예시입니다.
- 알람이 울리는 횟수를 세기 시작한 시각은 12시 0분 0초입니다.
- 초침과 시침, 분침이 겹칩니다. 이때 알람이 한 번 울립니다. 이와 같이 0시 정각, 12시 정각에 초침과 시침, 분침이 모두 겹칠 때는 알람이 한 번만 울립니다.
- 이후 12시 0분 30초까지 초침과 시침/분침이 겹치는 일은 없습니다.
12시 0분 0초부터 12시 0분 30초까지는 알람이 한 번 울립니다.
알람이 울리는 횟수를 센 시간을 나타내는 정수 h1
, m1
, s1
, h2
, m2
, s2
가 매개변수로 주어집니다. 이때, 알람이 울리는 횟수를 return 하도록 solution 함수를 완성해주세요.
제한사항
- 0 ≤
h1
,h2
≤ 23 - 0 ≤
m1
,m2
≤ 59 - 0 ≤
s1
,s2
≤ 59 h1시 m1분 s1초
부터h2시 m2분 s2초
까지 알람이 울리는 횟수를 센다는 의미입니다.h1시 m1분 s1초
<h2시 m2분 s2초
- 시간이 23시 59분 59초를 초과해서 0시 0분 0초로 돌아가는 경우는 주어지지 않습니다.
입출력 예
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 |
입출력 예 설명
입출력 예 #1
문제 예시와 같습니다.
입출력 예 #2
문제 예시와 같습니다.
입출력 예 #3
0시 6분 1초부터 0시 6분 6초까지 초침과 시침/분침이 겹치는 일은 없습니다. 따라서 알람이 울리지 않으며 0을 return 해야 합니다.
입출력 예 #4
- 11시 59분 30초부터 11시 59분 59초까지 초침과 시침/분침이 겹치는 일은 없습니다.
- 12시 0분 0초에 초침과 시침, 분침이 겹칩니다. 이때 알람이 한 번 울립니다.
11시 59분 30초부터 12시 0분 0초까지 초침과 시침/분침이 겹치는 횟수는 1이며 따라서 알람이 한 번 울립니다.
입출력 예 #5
- 약 11시 58분 59.917초에 초침과 시침이 겹칩니다. 이때 알람이 한 번 울립니다.
11시 58분 59초부터 11시 59분 0초까지 초침과 시침/분침이 겹치는 횟수는 1이며 따라서 알람이 한 번 울립니다.
입출력 예 #6
- 약 1시 5분 5.085초에 초침과 분침이 겹칩니다. 이때 알람이 한 번 울립니다.
- 약 1시 5분 5.424초에 초침과 시침이 겹칩니다. 이때 알람이 한 번 울립니다.
1시 5분 5초부터 1시 5분 6초까지 초침과 시침/분침이 겹치는 횟수는 2며 따라서 알람이 두 번 울립니다.
입출력 예 #7
0시 0분 0초부터 23시 59분 59초까지 초침과 시침/분침이 겹치는 횟수는 2852며 따라서 알람이 총 2852번 울립니다.
나의 풀이
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
def solution(h1, m1, s1, h2, m2, s2):
answer = -1
sec_time1=h1*3600+m1*60+s1
sec_time2=h2*3600+m2*60+s2
total_sec=sec_time2-sec_time1
h_per_sec=1/120
m_per_sec=1/10
s_per_sec=6
cnt=0
if (sec_time1)%3600==0:
cnt+=1
for t in range(sec_time1,sec_time2):
h_angle=(h_per_sec*t)%360
m_angle=(m_per_sec*t)%360
s_angle=(s_per_sec*t)%360
nh_angle=(h_per_sec*(t+1))%360 if (h_per_sec*(t+1))%360!=0 else 360
nm_angle=(m_per_sec*(t+1))%360 if (m_per_sec*(t+1))%360!=0 else 360
ns_angle=(s_per_sec*(t+1))%360 if (s_per_sec*(t+1))%360!=0 else 360
if s_angle<h_angle and ns_angle>=nh_angle:
cnt+=1
if s_angle<m_angle and ns_angle>=nm_angle:
cnt+=1
if nh_angle==nm_angle==ns_angle:
cnt-=1
answer=cnt
return answer
- 각도를 이용해서 현재와 그 다음 초 사이에 시침과 분침이 있는지를 판단하고 답을 구하는 것까지는 생각했다.
- 구현 과정에서 오류가 좀 있어서 오래 걸렸다.
- 만약 시침, 분침, 초침이 모두 겹치는 경우는 cnt에서 하나를 빼주어야 된다. (중복 방지)