본문 바로가기
Algorithm/구현

[프로그래머스 lv 3] PCCP 기출 3번 아날로그 시계

by HANNI하니 2023. 12. 8.

사용 언어 - Python3

문제 -  PCCP 기출 3번 아날로그 시계

https://school.programmers.co.kr/learn/courses/30/lessons/250135?language=python3

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

정답

구현

초침이 시/분침과 만나는 경우 생각하기

1. 초를 기준으로 시간을 계산한다

시/분/초 = 시간 * 60분 * 60초 + 분 * 60초 + 초

 

2. 시분초가 만나는 무조건 만나는 시간은 0시와 12시일 때이다.

 

3. while start < end

시작시간이 끝시간을 넘지 않을 때까지 1초씩 움직이면서 겹치는지 확인해준다.

 

4. 시/분/초침이 1초마다 이동하는 각도를 계산한다.

시침 = 30도 도는데 3600초(1시간*60*60) 걸린다. 1초 = 1/120도 회전

분침 = 30도 도는데 300초(5분*60) 걸린다. 1초 = 1/10도 회전

초침 = 30도 도는데 5초 걸린다. 1초 = 6도 회전

 

5. 1초후의 각도와 현재의 각도가 cross 된다면 만나기 때문에 1초후의 각도도 계산해준다.

 

6. 만약 시/분/초침의 각도가 0도로 돌아오면 계속 돌아가야 하기 때문에 360도로 맞춰준다.

 

7. 초침이 시침/분침과 만나는 경우 생각하기

7.1. 1초 후에 시/분/초가 모두 같은 각도인 경우

7.2. 시침이 초침보다 각도가 큰 상태에서, 1초 후에 초침의 각도가 더 커지는 경우

7.3. 분침이 초침보다 각도가 큰 상태에서, 1초 후에 초침의 각도가 더 커지는 경우

 

8. 시간을 1초씩 추가해주면서 모든 초마다 각도를 계산하고 확인하면서 겹치는 경우를 카운트한다.

 

def solution(h1, m1, s1, h2, m2, s2):
    # 초를 기준으로 분/시 계산
    start = (h1 * 3600) + (m1 * 60) + s1
    end = (h2 * 3600) + (m2 * 60) + s2

    ans = 0
    
    # 시분초 만나는 시간 = 시작시간 0시 or 12시 정각 
    if start == 0 or start == (60 * 60 * 12):
        ans += 1

    # 초마다 이동하는 각도로 표현하기
    # 시침 = 30도 도는데 3600초(1시간*60*60) 걸림. 1초에 1/120도 만큼 회전
    # 분침 = 30도 도는데 300초(5분*60) 걸림. 1초에 1/10도 만큼 회전
    # 시침 = 30도 도는데 5초 걸림. 1초에 6도 회전
    while start < end:
        rad_h = (start / 120) % 360
        rad_m = (start / 10) % 360
        rad_s = (start * 6) % 360
        
        # 1초후 각도 구하기 -> rad와 rad_next가 서로 겹친다면 만나는 것!
        rad_h_next = ((start + 1) / 120) % 360
        rad_m_next = ((start + 1) / 10) % 360
        rad_s_next = ((start + 1) * 6) % 360
        
        # 0으로 돌아오면 다시 360도로 맞춰주기
        if rad_h_next == 0:
            rad_h_next = 360
        if rad_m_next == 0:
            rad_m_next = 360
        if rad_s_next == 0:
            rad_s_next = 360
        
        # 초침이 시침/분침과 만나는 경우
        # 1. 1초 후에 시/분/초 같이 만나는 경우
        if rad_h_next == rad_m_next == rad_s_next:
            ans += 1
            start += 1
            continue
        # 2. 시침이 초침보다 각도가 큰 상태에서, 1초 후에 초침의 각도가 더 커지는 경우
        if rad_s < rad_h and rad_s_next >= rad_h_next:
            ans += 1
        # 3. 분침이 초침보다 각도가 큰 상태에서, 1초 후에 초침의 각도가 더 커지는 경우
        if rad_s < rad_m and rad_s_next >= rad_m_next:
            ans += 1

        start += 1
    return ans

 

 

레퍼런스

  • 깃허브 정답
 

댓글