[programmers/py] [PCCP 기출문제] 3번 / 아날로그 시계

승민·2024년 5월 29일

알고리즘

목록 보기
123/171

[PCCP 기출문제] 3번 / 아날로그 시계

https://school.programmers.co.kr/learn/courses/30/lessons/250135

문제 설명

시계에는 초침이 시침/분침과 겹칠 때마다 알람이 울리는 기능이 있습니다. 당신은 특정 시간 동안 알람이 울린 횟수를 알고 싶습니다.

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

풀이

처음 풀이는 공식을 통해 매 시간, 분 단위로 겹치는 갯수를 구해서 값을 구하려 함 -> 생각보다 고려해야 할 조건이 많아서 포기

0~23:59:59까지의 수를 계산해보니 생각보다 큰 수가 아니라 1초마다 계산하는 방식으로 변경

1. 시작과 끝나는 시간은 초단위로 변경
2. 시침은 1초당 1/120도, 분침은 1초당 0.1도 이동, 시침은 1초당 6도 이동
3. 처음에 0시 또는 12시인 경우 시-분-초침이 만나서 시작
4. 맨 처음 시, 분, 초침의 각도를 구한 후 1초 뒤 시, 분, 초침의 각도를 구한다.
  4-1. 시침 각도 > 초침 각도 -> 1초뒤 시침 각도 <= 초침 각도면 시침과 초침이 만난 경우
  4-2. 분침도 동일
  4-3. 만약 시침, 분침, 초침이 같다면 -1을 한다.
def solution(h1, m1, s1, h2, m2, s2):
    answer = 0
    
    start_t = h1 * 3600 + m1*60 + s1 # 시작 시간
    end_t = h2*3600 + m2*60 + s2 # 끝 시간
    
    # 시작부터 만나는 경우
    if start_t == 0 or start_t == 12*3600:
        answer += 1
    
    while start_t < end_t:
        h_deg = start_t / 120 % 360 # 시침은 1초에 1/120
        m_deg = start_t / 10 % 360 # 분침은 1초에 0.1도
        s_deg = start_t * 6 % 360 # 시침은 1초에 6도
        
        start_t += 1

        # 각각 다음 각도를 구해서 이전 각도와 비교 후 answer을 더해준다
        # 이때, 0도는 360으로 변경해준다.
        hn = 360 if start_t / 120 % 360 == 0 else start_t / 120 % 360
        mn = 360 if start_t / 10 % 360 == 0 else start_t / 10 % 360
        sn = 360 if start_t * 6 % 360 == 0 else start_t * 6 % 360
        
        # 이전 시침각이 더 작은데 1초 후 크거나 같으면 만난 것
        if s_deg < h_deg and sn >= hn:
            answer += 1
        if s_deg < m_deg and sn >= mn :
            answer += 1
        # 시침-분침-초침이 동시에 겹치면 -1
        if sn == hn and hn == mn:
            answer -= 1
    
    return answer

회고

너무 복잡하게 생각하지 말자.

1초마다 각도를 구해 답을 구할 수 있는데 수식을 통해 찾으려다가 시간을 많이 소모함

0개의 댓글