코테 문제풀이 - [PCCP 기출문제] 3번 / 아날로그 시계

정상헌·2024년 1월 4일

코딩테스트연습

목록 보기
1/13
post-thumbnail

문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/250135

input : 시작 시점의 시간, 끝 시점의 시간
output : 시작 시간부터 끝나는 시간까지 아날로그 시계가 동작하는 동안 초침이 분침 혹은 시침과 만나는 횟수 반환

문제 분석

초침 > 분침 > 시침 순으로 움직이는 속도가 다릅니다.
초침이 제일 빠르고 1분에 한바퀴 도니까 그냥 1분에 2번씩 울리는거 아닌가? 라고 생각할 수 있지만, 다음을 주의해야 합니다.

  • 주의 1. 12시 정각으로, 시침, 분침, 초침 모두 겹치는 경우
    -> 2번이 아니라 1번 울립니다.
  • 주의 2. 시침과 분침이 1분동안 초침의 초기 각도를 추월한 경우
    -> 울리지 않습니다.
    • 이는 시침은 12시간에 1번, 분침은 1시간에 1번 꼴로 일어납니다.

초침, 분침, 시침이 시간단위별로 몇도씩 움직이는지 확인해봅시다.

  • 초침은
    • 1분 -> 360도
    • 1초 -> 6도
  • 분침은
    • 1분 -> 6도
    • 1초 -> 0.1도
  • 시침은
    • 1시간 -> 30도
    • 1분 -> 0.5도
    • 1초 -> 1/120도

문제 해결

시간, 분, 초가 input으로 주어졌을 때, 12시를 기준으로 시침, 분침, 초침이 몇도를 이루고 있는지 구하여 반환하는 함수를 이용했습니다.

  • ex) 12시 6분 30초
    • s_ang = 180.0
    • m_ang = 39.0
    • h_ang = 390/120

이 함수를 이용해 매초마다 각도를 계산해서, 초침이 분침 혹은 시침의 각도를 추월한 경우 alarm_count를 1씩 증가하는 방식으로 문제를 해결했습니다.

코드


from typing import Tuple

def find_angles(h: int, m: int, s: int) -> Tuple[float, float, float]:
    s_ang = float(s * 6)
    m_ang = float(m * 6 + s * 0.1)
    h_ang = float((h % 12) * 30 + m * 0.5 + s / 120)

    return (h_ang, m_ang, s_ang)

def solution(h1, m1, s1, h2, m2, s2):
    alarm_count = 0
    p_h_ang, p_m_ang, p_s_ang = find_angles(h1, m1, s1)
    p_h, p_m, p_s = h1, m1, s1
    if p_h_ang == p_m_ang == p_s_ang: # 시작 시점이 12시 정각인 경우
        alarm_count += 1
    
    # 초와 각도를 증가시키는 while 문    
    while True:
        # 1초씩 증가
        n_s = (p_s + 1) % 60
        n_m = (p_m + (p_s + 1) // 60) % 60
        n_h = (p_h + (p_m + (p_s + 1) // 60) // 60) % 24
        n_h_ang, n_m_ang, n_s_ang = find_angles(n_h, n_m, n_s)
        
        # 초의 각도가 분의 각도를 추월하는 순간 알림 카운트
        if (p_s_ang < p_m_ang and n_s_ang >= n_m_ang) or (p_s_ang < p_m_ang and n_s_ang == 0.0):
            alarm_count += 1
        
        # 초의 각도가 시의 각도를 추월하는 순간 알림 카운트
        if (p_s_ang < p_h_ang and n_s_ang >= n_h_ang) or (p_s_ang < p_h_ang and n_s_ang == 0.0):
            alarm_count += 1
        
        # 12시 정각인 경우 count -= 1
        if n_h_ang == n_m_ang == n_s_ang: # 시작 시점이 12시 정각인 경우
            alarm_count -= 1
        
        if n_h == h2 and n_m == m2 and n_s == s2:
            break
        
        p_h, p_m, p_s = n_h, n_m, n_s
        p_h_ang, p_m_ang, p_s_ang = n_h_ang, n_m_ang, n_s_ang
        
    return alarm_count



input_1 = [0, 5, 30, 0, 7, 0]
input_2 = [12, 0, 0, 12, 0, 30]
input_3 = [0, 6, 1, 0, 6, 6]
input_4 = [11, 59, 30, 12, 0, 0]
input_5 = [11, 58, 59, 11, 59, 0]
input_6 = [0, 0, 0, 23, 59, 59]

print(f'answer : {solution(*input_5)}')


'''
입출력 예시
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
'''
profile
도봉구왕감자

0개의 댓글