Post
아날로그 시계(L2) | Gihun Son

아날로그 시계(L2)

문제 설명

시침, 분침, 초침이 있는 아날로그시계가 있습니다. 시계의 시침은 12시간마다, 분침은 60분마다, 초침은 60초마다 시계를 한 바퀴 돕니다. 따라서 시침, 분침, 초침이 움직이는 속도는 일정하며 각각 다릅니다. 이 시계에는 초침이 시침/분침과 겹칠 때마다 알람이 울리는 기능이 있습니다. 당신은 특정 시간 동안 알람이 울린 횟수를 알고 싶습니다.

다음은 0시 5분 30초부터 0시 7분 0초까지 알람이 울린 횟수를 세는 예시입니다.

https://grepp-programmers.s3.ap-northeast-2.amazonaws.com/files/production/fee10e9e-2871-4caf-94e4-b55b2dbcaea9/ex1-1.png

  • 가장 짧은 바늘이 시침, 중간 길이인 바늘이 분침, 가장 긴 바늘이 초침입니다.
  • 알람이 울리는 횟수를 세기 시작한 시각은 0시 5분 30초입니다.
  • 이후 0시 6분 0초까지 초침과 시침/분침이 겹치는 일은 없습니다.

https://grepp-programmers.s3.ap-northeast-2.amazonaws.com/files/production/61dd5cec-944e-4f48-a3ae-95fd498e197e/ex1-2.png

  • 약 0시 6분 0.501초에 초침과 시침이 겹칩니다. 이때 알람이 한 번 울립니다.
  • 이후 0시 6분 6초까지 초침과 시침/분침이 겹치는 일은 없습니다.

https://grepp-programmers.s3.ap-northeast-2.amazonaws.com/files/production/d2274db1-cb08-45d0-a6d4-ac6d76705f67/ex1-3.png

  • 약 0시 6분 6.102초에 초침과 분침이 겹칩니다. 이때 알람이 한 번 울립니다.
  • 이후 0시 7분 0초까지 초침과 시침/분침이 겹치는 일은 없습니다.

0시 5분 30초부터 0시 7분 0초까지는 알람이 두 번 울립니다. 이후 약 0시 7분 0.584초에 초침과 시침이 겹쳐서 울리는 세 번째 알람은 횟수에 포함되지 않습니다.

다음은 12시 0분 0초부터 12시 0분 30초까지 알람이 울린 횟수를 세는 예시입니다.

https://grepp-programmers.s3.ap-northeast-2.amazonaws.com/files/production/3b0781d9-0640-428e-bd9d-4d8c70a3c578/ex2-1.png

  • 알람이 울리는 횟수를 세기 시작한 시각은 12시 0분 0초입니다.
  • 초침과 시침, 분침이 겹칩니다. 이때 알람이 한 번 울립니다. 이와 같이 0시 정각, 12시 정각에 초침과 시침, 분침이 모두 겹칠 때는 알람이 한 번만 울립니다.

https://grepp-programmers.s3.ap-northeast-2.amazonaws.com/files/production/9f178f43-9819-4b7a-8ed1-783cec0febe3/ex2-2.png

  • 이후 12시 0분 30초까지 초침과 시침/분침이 겹치는 일은 없습니다.

12시 0분 0초부터 12시 0분 30초까지는 알람이 한 번 울립니다.

알람이 울리는 횟수를 센 시간을 나타내는 정수 h1m1s1h2m2s2가 매개변수로 주어집니다. 이때, 알람이 울리는 횟수를 return 하도록 solution 함수를 완성해주세요.


제한사항

  • 0 ≤ h1h2 ≤ 23
  • 0 ≤ m1m2 ≤ 59
  • 0 ≤ s1s2 ≤ 59
  • h1시 m1분 s1초부터 h2시 m2분 s2초까지 알람이 울리는 횟수를 센다는 의미입니다.
    • h1시 m1분 s1초 < h2시 m2분 s2초
    • 시간이 23시 59분 59초를 초과해서 0시 0분 0초로 돌아가는 경우는 주어지지 않습니다.

입출력 예

h1m1s1h2m2s2result
05300702
1200120301
0610660
11593012001
115859115901
1551562
0002359592852

입출력 예 설명

입출력 예 #1

문제 예시와 같습니다.

입출력 예 #2

문제 예시와 같습니다.

입출력 예 #3

0시 6분 1초부터 0시 6분 6초까지 초침과 시침/분침이 겹치는 일은 없습니다. 따라서 알람이 울리지 않으며 0을 return 해야 합니다.

입출력 예 #4

https://grepp-programmers.s3.ap-northeast-2.amazonaws.com/files/production/1b7bbaf3-652a-469a-ab36-3434b77920e3/ex3-1.png

  • 11시 59분 30초부터 11시 59분 59초까지 초침과 시침/분침이 겹치는 일은 없습니다.

https://grepp-programmers.s3.ap-northeast-2.amazonaws.com/files/production/3b0781d9-0640-428e-bd9d-4d8c70a3c578/ex2-1.png

  • 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에서 하나를 빼주어야 된다. (중복 방지)
This post is licensed under CC BY 4.0 by the author.