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

Gaanii·2024년 10월 17일
1

Problem Solving

목록 보기
40/210
post-thumbnail

아래 프로그래머스 로고를 클릭하면 해당 문제로 이동합니다 😀

프로그래머스로고



풀이과정


일단 시간을 전부 초 단위로 바꿔줬다.
1분 → 60초, 1시간→60분→3600초니까 시작시간과 끝나는 시간을 일단 초로 바꾸자.

그리고 나서 0시 0분 0초일때와 12시 0분 0초일때, 즉 시침 == 분침 == 초침일 경우를 따로 if문으로 체크해줬다.


그러면 이제 while문을 돌면서 시간을 1초씩 올려가며 체크하면 되는데 ...
일단 각도를 쓰는 문제라는걸 생각했으니 초침, 분침, 시침을 각도로 생각해보자.

초침은 360도를 60번 똑딱똑딱 하니까 360/60 = 6(d/s)
분침은 360도를 60번 똑딱똑딱 하니까 360/60 = 6(d/m) = 6/60 = 1/10(d/s)
시침은 360도를 12번 똑딱똑딱 하니까 360/12 = 30(d/h) = 30/60(d/m) = 1/120(d/s)이다.


근데 이 각도가 소수로 나오니 이걸로 조건을 거는게 어려웠다.. 그래서 결국 프로그래머스 질문탭에서 힌트를 얻어버렸지 뭐야 .. 😂

현재 시간의 초침, 분침, 시침의 각도를 체크하고 1초가 지났을 때의 초침, 분침, 시침의 각도를 체크했다.
여기서 주의해야 하는 점은, 1초가 지났을 때 %360을 해서 0이 되는 경우가 생겨버려서 이 경우는 360으로 처리하게 코드를 작성했다.


암튼 그리고 나서 젤 생각해내기 어려웠던 조건 부분이다.

1. 현재 초침의 각도가 시침의 각도보다 작고, 1초 후의 초침의 각도가 시침의 각도보다 클 경우, cnt += 1

2. 현재 초침의 각도가 분침의 각도보다 작고, 1초 후의 초침의 각도가 분침의 각도보다 클 경우, cnt += 1

3. 현재 초침의 각도와 분침의 각도와 시침의 각도가 모두 같은 경우, cnt -= 1

[1, 2번 조건]
현재 시침이 숫자 2에 가있을때 초침이 2에 코딱지만큼 못미쳤고,
1초 후의 시침이 숫자 2보다 코딱지만큼 넘어갔고 현재 시침은 숫자 2에서 개미코딱지만큼 움직인 그런 경우랄까 ?

예시가 좀 더럽긴 하지만 암튼 내가 이해한 방식이다..

[3번 조건]
위에서 1, 2번에 모두 걸렸을 경우 중복이 되기 때문에 제거해준다.

위 세개의 조건을 체크한 후 초를 하나 올려주면 된다.


코드


def solution(h1, m1, s1, h2, m2, s2):
    answer = 0
    start_time, end_time = h1 * 3600 + m1 * 60 + s1, h2 * 3600 + m2 * 60 + s2

    if start_time == 0 or start_time == 12 * 3600:
        answer += 1

    while start_time < end_time:
        h_angle = start_time / 120 % 360
        m_angle = start_time / 10 % 360
        s_angle = start_time * 6 % 360

        next_h_angle = 360 if (start_time + 1) / 120 % 360 == 0 else (start_time + 1) / 120 % 360
        next_m_angle = 360 if (start_time + 1) / 10 % 360 == 0 else (start_time + 1) / 10 % 360
        next_s_angle = 360 if (start_time + 1) * 6 % 360 == 0 else (start_time + 1) * 6 % 360

        # 1초후에 초침이 시침을 넘어가면
        if s_angle < h_angle and next_h_angle <= next_s_angle:
            answer += 1

        # 1초 후에 초침이 분침을 넘어가면
        if s_angle < m_angle and next_m_angle <= next_s_angle:
            answer += 1

        if next_s_angle == next_m_angle == next_h_angle:
            answer -= 1

        start_time += 1
    return answer


결과


정답

0개의 댓글