코딩테스트/프로그래머스

[프로그래머스] [구현] 3번 / 아날로그 시계

박소민 2025. 1. 23. 23:53
[PCCP 기출문제] 3번 / 아날로그 시계
 

프로그래머스

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

programmers.co.kr

 

  • 풀이
    • 못풀어서 해설보고 이해만 함
      • 시,분,침을 같은 방면에서 비교하려면 “초”아니면 “각도”
        • 여기서는 각도로 비교
        • 1초 당 얼마 만큼의 각도를 움직였는가
          • 숫자 간격마다 360도/12 = 30도
            • 시침: 1시간(3600초) 당 30도 -> 1초 당 30/3600= 1/120도
            • 분침: 5분(5*60초)당 30도 -> 1분 당 6도 -> 1초 당 6/60= 1/10도
            • 초침: 5초당 30 도 -> 1초당 6도
        • 1초 뒤 각도를 계산해서, 1초뒤의 초침이 시침, 분침을 넘어가는지를 체크
          • 넘어가려면 현재는 초침이 더 뒤에 있고(더 작은 각도), 1초뒤에는 더 앞에 있어야함 (더 큰 각도)
        • 1초뒤에 시,분,침이 모두 같은 경우에는 2번 더해지므로 1번 빼주기
def solution(h1, m1, s1, h2, m2, s2):
    
    answer = 0
    mcount, hcount = 0,0
    second1 = h1*60*60 + m1*60 + s1
    second2 = h2*60*60 + m2*60 + s2
    
    #넘기는 횟수를 세기때문에 시작시간 정각인 경우 따로 더해줌 
    if second1 == 0 or second1 == 60*60*12 :
        answer += 1
    
    for i in range(second1, second2) :
        '''
        숫자 간격마다 360도/12 = 30도
        - 시침: 1시간(3600초) 당 30도 -> 1초 당 30/3600= 1/120도
        - 분침: 5분(5*60초)당 30도 -> 1분 당 6도 -> 1초 당 6/60= 1/10도
        - 초침: 5초당 30 도 -> 1초당 6도
        '''
        # i초에 시,분,초침이 움직인 각도 (360를 넘지 않도록 나눔)
        s = (i*6)%360
        m = (i/10)%360
        h = (i/120)%360

        # i+1초 뒤 각도
        # 0도를 360도로 바꾼 이유는 359도랑 비교했을 때 한바퀴임을 명시하려고
        ns = 360 if (i+1)*6%360 == 0 else (i+1)*6%360
        nm = 360 if (i+1)/10%360 == 0 else (i+1)/10%360
        nh = 360 if (i+1)/120%360 == 0 else (i+1)/120%360
        
        if s < h and ns >= nh :
            hcount += 1
        if s < m and ns >= nm :
            mcount += 1
            
        # 시,분,침이 같은 경우 두번 더해지는 것을 방지하기 위해 한번 빼기
        if ns==nm==nh :
            answer -= 1
            
    answer += mcount + hcount
    
    return answer