[Python] 프로그래머스 아날로그 시계
https://school.programmers.co.kr/learn/courses/30/lessons/250135?language=python3
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
풀이
시작시간과, 끝 시간이 주어질때 초침이 분침/시침과 겹치는 횟수를 세는 문제입니다. 단, 초침이 분침/시침과 동시에 겹치는 경우 1번으로 카운트 합니다.
현재 시간과 끝시간을 초 단위로 변환하고 while 문을 돌며 겹치는 횟수를 카운팅 합니다. 이때, 00시와 12시는 초침이 분침/시침과 겹치지만 다시 오지 않는 시간이므로 미리 카운팅 해줍니다.
시침과 분침이 360도 중 몇도에 위치하는지 계산하기 위해 시침/분침의 deg/sec 을 계산해줍니다.
시침의 경우 3600초 (60분) 당 30deg(360/12)을 움직이므로 30/3600 = 1/120 deg/sec 입니다.
분침의 경우 3600초 (60분) 당 360deg 을 움직이므로 360/3600 = 1/10 deg/sec 입니다.
초침의 경우 60초당 360deg을 움직이므로 360/60 = 6 deg/sec 입니다.
초단위로 바꾼 현재 시간을 초침/분침/시침의 각도로 변환하기 위해,
현재시간(초) * deg/sec % 360 로 현재 위치를 계산해 줍니다. (총 시간(초) * deg/sec = 총 시간동안 움직인 degree)
다음 위치 또한 마찬가지로 계산해줍니다. 단, 1바퀴를 도는 경우 0이 아닌 360으로 계산해주어야 합니다.
sNextAngle >= hNextAngle 에서 0 >= 359.x 인 경우 겹쳤는데도 겹치지 않는 경우라고 판단되는 경우가 생기기 때문입니다.
마지막으로, 초침이 시침/분침과 동시에 겹치는 경우를 제외해주고 답을 리턴합니다.
def solution(h1, m1, s1, h2, m2, s2):
answer = 0
# 시작시간과 끝시간을 초단위로 변환
startTime = h1 * 3600 + m1 * 60 + s1
endTime = h2 * 3600 + m2 * 60 + s2
# next기준으로 계산할거니 포함되지 않는 시작시간 00시, 12시 미리 카운팅
if startTime == 0 * 3600 or startTime == 12 * 3600:
answer += 1
while startTime < endTime:
# 시침 1시간 = 30도 -> 1초에 30/3600도 즉, 1/120도 이동
# 분침 1분 = 6도 -> 1초에 6/60도 즉, 1/10도 이동
# 초침 1초 = 6도 -> 1초에 6도 이동
hCurAngle = startTime / 120 % 360
mCurAngle = startTime / 10 % 360
sCurAngle = startTime * 6 % 360
# 다음 위치가 360도가 아닌 0도로 계산되어 카운팅에 포함되지 않는 경우 방지
# 이동했을 때 지나쳤거나 같아졌는지를 비교하는 것이므로 현재위치는 해줄 필요없음
hNextAngle = 360 if (startTime + 1) / 120 % 360 == 0 else (startTime + 1) / 120 % 360
mNextAngle = 360 if (startTime + 1) / 10 % 360 == 0 else (startTime + 1) / 10 % 360
sNextAngle = 360 if (startTime + 1) * 6 % 360 == 0 else (startTime + 1) * 6 % 360
if sCurAngle < hCurAngle and sNextAngle >= hNextAngle:
answer += 1
if sCurAngle < mCurAngle and sNextAngle >= mNextAngle:
answer += 1
# 시침/분침과 동시에 겹쳤을 때 중복카운팅 제외
if sNextAngle == hNextAngle and hNextAngle == mNextAngle:
answer -= 1
startTime += 1
return answer