[프로그래머스] PCCP 기출 3번 - 파이썬

JinUk Lee·2023년 11월 21일
0

프로그래머스

목록 보기
46/48


def solution(h1, m1, s1, h2, m2, s2):

    # h1시 m1분 s1초 => h2시 m1분 s2초

	#시작 시간과 끝나는 시간을 초로 환산한다
    start = h1 * 3600 + m1*60 +s1 # 330
    end = h2 * 3600 + m2*60 +s2 # 420

    cnt = 0
    
    # 처음 시간이 0시나 12시인것을 체크해줌
    if start==0 or start==43200:
        cnt+=1
       
    # 시침 => 30도 도는데 3600초 걸림. 1초에 1/120도 만큼 회전
    # 분침 => 30도 도는데 300초 걸림. 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

        next_rad_h = ((start+1) / 120) % 360
        next_rad_m = ((start+1) / 10) % 360
        next_rad_s = ( (start+1) * 6) % 360

        if next_rad_h==0:
            next_rad_h=360
        if next_rad_m==0:
            next_rad_m=360
        if next_rad_s==0:
            next_rad_s=360

        if next_rad_h == next_rad_m == next_rad_s:
            cnt += 1
            start+=1
            continue
            
        if rad_h > rad_s and next_rad_h <= next_rad_s:
            cnt+=1
        if rad_m > rad_s and next_rad_m <= next_rad_s:
            cnt+=1

        start+=1

    return cnt

12시와 시침, 분침, 초침 사이의 각도로 문제를 접근했다.

각도는 다음과 같이 접근할 수 있다.

    # 시침 => 30도 도는데 3600초 걸림. 1초에 1/120도 만큼 회전
    # 분침 => 30도 도는데 300초 걸림. 1초에 1/10도 만큼 회전
    # 초침 => 30도 도는데 5초 걸림. 1초에 6도 회전

여기서 구한 각도를 활용하면 시침 초침 분침이 만나는 횟수를 구할 수 있다.

시침과 초침, 분침과 초침이 만나는 경우는 다음과 같다.

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

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

또한, 시침 분침 초침이 같이 만나는 경우도 체크해줘야한다.

주의할 점은 59초에서 0초로 넘어가는 경우 각도가 0도가 되어버리므로 이를 360도로 바꿔서 계산할 필요가 있다.

profile
개발자 지망생

0개의 댓글