[프로그래머스] 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개의 댓글

관련 채용 정보