코딩테스트/Python

[Programmers] Level 2. 아날로그 시계

swwho 2025. 3. 26. 21:50
728x90
반응형

🔗 Problem Link

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr


❔Thinking

  • 아날로그 시계에서, 초침이 주어진 시간 범위 내에서의 시침 또는 분침과 일치하는 횟수를 반환한다.
  • 두개의 바늘이 겹친다는 의미는, 하나의 바늘이 1초 후에 다른 바늘보다 앞선다는 뜻과 동일하다.
  • 00시와 12시는 모든 바늘이 겹치는 구간이기 때문에, 정확히 예외처리를 해야 한다.

💻Solution

def solution(h1, m1, s1, h2, m2, s2):
    cnt = 0
    init_time = h1*60*60 + m1*60 + s1
    end_time = h2*60*60 + m2*60 + s2

    if init_time == 0 or end_time == 60*60*12:
        cnt += 1
    
    for t in range(init_time, end_time):
        s_angle = (6*t) % 360
        m_angle = (t/10) % 360
        h_angle = (t/120) % 360
        
        next_s_angle = 360 if (6*(t+1)) % 360 == 0 else (6*(t+1)) % 360
        next_m_angle = 360 if ((t+1)/10) % 360 == 0 else ((t+1)/10) % 360
        next_h_angle = 360 if ((t+1)/120) % 360 == 0 else ((t+1)/120) % 360
        
        if s_angle < h_angle and next_s_angle >= next_h_angle:
            cnt += 1
        if s_angle < m_angle and next_s_angle >= next_m_angle:
            cnt += 1
        if next_s_angle == next_m_angle == next_h_angle:
            cnt -= 1

    return cnt

🗝️keypoint

  1. 두 바늘의 일치를 각도나 시간으로 계산하지 않고, '지나가는 지점이 있으면'이라는 기준으로 판단하는 것이 중요하다.
  2. 만약 바늘이 1초 후에 정각을 가르키면 각도가 0도가 되기 때문에, 이 부분에 대한 예외 처리가 중요하다.