[PCCP 기출문제] 3번 / 아날로그 시계
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
- 풀이
- 못풀어서 해설보고 이해만 함
- 시,분,침을 같은 방면에서 비교하려면 “초”아니면 “각도”
- 여기서는 각도로 비교
- 1초 당 얼마 만큼의 각도를 움직였는가
- 숫자 간격마다 360도/12 = 30도
- 시침: 1시간(3600초) 당 30도 -> 1초 당 30/3600= 1/120도
- 분침: 5분(5*60초)당 30도 -> 1분 당 6도 -> 1초 당 6/60= 1/10도
- 초침: 5초당 30 도 -> 1초당 6도
- 숫자 간격마다 360도/12 = 30도
- 1초 뒤 각도를 계산해서, 1초뒤의 초침이 시침, 분침을 넘어가는지를 체크
- 넘어가려면 현재는 초침이 더 뒤에 있고(더 작은 각도), 1초뒤에는 더 앞에 있어야함 (더 큰 각도)
- 1초뒤에 시,분,침이 모두 같은 경우에는 2번 더해지므로 1번 빼주기
- 시,분,침을 같은 방면에서 비교하려면 “초”아니면 “각도”
- 못풀어서 해설보고 이해만 함
def solution(h1, m1, s1, h2, m2, s2):
answer = 0
mcount, hcount = 0,0
second1 = h1*60*60 + m1*60 + s1
second2 = h2*60*60 + m2*60 + s2
#넘기는 횟수를 세기때문에 시작시간 정각인 경우 따로 더해줌
if second1 == 0 or second1 == 60*60*12 :
answer += 1
for i in range(second1, second2) :
'''
숫자 간격마다 360도/12 = 30도
- 시침: 1시간(3600초) 당 30도 -> 1초 당 30/3600= 1/120도
- 분침: 5분(5*60초)당 30도 -> 1분 당 6도 -> 1초 당 6/60= 1/10도
- 초침: 5초당 30 도 -> 1초당 6도
'''
# i초에 시,분,초침이 움직인 각도 (360를 넘지 않도록 나눔)
s = (i*6)%360
m = (i/10)%360
h = (i/120)%360
# i+1초 뒤 각도
# 0도를 360도로 바꾼 이유는 359도랑 비교했을 때 한바퀴임을 명시하려고
ns = 360 if (i+1)*6%360 == 0 else (i+1)*6%360
nm = 360 if (i+1)/10%360 == 0 else (i+1)/10%360
nh = 360 if (i+1)/120%360 == 0 else (i+1)/120%360
if s < h and ns >= nh :
hcount += 1
if s < m and ns >= nm :
mcount += 1
# 시,분,침이 같은 경우 두번 더해지는 것을 방지하기 위해 한번 빼기
if ns==nm==nh :
answer -= 1
answer += mcount + hcount
return answer
'코딩테스트 > 프로그래머스' 카테고리의 다른 글
| [프로그래머스] 등산코스 정하기 (1) | 2025.02.02 |
|---|---|
| [프로그래머스][그리디] 요격 시스템 (0) | 2025.01.24 |
| [프로그래머스][그리디] 숫자 게임 (0) | 2024.12.06 |
| [프로그래머스][구현] 충돌위험 찾기 (0) | 2024.12.03 |
| [프로그래머스][BFS] 석유 시추 (0) | 2024.11.27 |