사용 언어 - Python3
문제 - PCCP 기출 3번 아날로그 시계
https://school.programmers.co.kr/learn/courses/30/lessons/250135?language=python3
정답
구현
초침이 시/분침과 만나는 경우 생각하기
1. 초를 기준으로 시간을 계산한다
시/분/초 = 시간 * 60분 * 60초 + 분 * 60초 + 초
2. 시분초가 만나는 무조건 만나는 시간은 0시와 12시일 때이다.
3. while start < end
시작시간이 끝시간을 넘지 않을 때까지 1초씩 움직이면서 겹치는지 확인해준다.
4. 시/분/초침이 1초마다 이동하는 각도를 계산한다.
시침 = 30도 도는데 3600초(1시간*60*60) 걸린다. 1초 = 1/120도 회전
분침 = 30도 도는데 300초(5분*60) 걸린다. 1초 = 1/10도 회전
초침 = 30도 도는데 5초 걸린다. 1초 = 6도 회전
5. 1초후의 각도와 현재의 각도가 cross 된다면 만나기 때문에 1초후의 각도도 계산해준다.
6. 만약 시/분/초침의 각도가 0도로 돌아오면 계속 돌아가야 하기 때문에 360도로 맞춰준다.
7. 초침이 시침/분침과 만나는 경우 생각하기
7.1. 1초 후에 시/분/초가 모두 같은 각도인 경우
7.2. 시침이 초침보다 각도가 큰 상태에서, 1초 후에 초침의 각도가 더 커지는 경우
7.3. 분침이 초침보다 각도가 큰 상태에서, 1초 후에 초침의 각도가 더 커지는 경우
8. 시간을 1초씩 추가해주면서 모든 초마다 각도를 계산하고 확인하면서 겹치는 경우를 카운트한다.
def solution(h1, m1, s1, h2, m2, s2):
# 초를 기준으로 분/시 계산
start = (h1 * 3600) + (m1 * 60) + s1
end = (h2 * 3600) + (m2 * 60) + s2
ans = 0
# 시분초 만나는 시간 = 시작시간 0시 or 12시 정각
if start == 0 or start == (60 * 60 * 12):
ans += 1
# 초마다 이동하는 각도로 표현하기
# 시침 = 30도 도는데 3600초(1시간*60*60) 걸림. 1초에 1/120도 만큼 회전
# 분침 = 30도 도는데 300초(5분*60) 걸림. 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
# 1초후 각도 구하기 -> rad와 rad_next가 서로 겹친다면 만나는 것!
rad_h_next = ((start + 1) / 120) % 360
rad_m_next = ((start + 1) / 10) % 360
rad_s_next = ((start + 1) * 6) % 360
# 0으로 돌아오면 다시 360도로 맞춰주기
if rad_h_next == 0:
rad_h_next = 360
if rad_m_next == 0:
rad_m_next = 360
if rad_s_next == 0:
rad_s_next = 360
# 초침이 시침/분침과 만나는 경우
# 1. 1초 후에 시/분/초 같이 만나는 경우
if rad_h_next == rad_m_next == rad_s_next:
ans += 1
start += 1
continue
# 2. 시침이 초침보다 각도가 큰 상태에서, 1초 후에 초침의 각도가 더 커지는 경우
if rad_s < rad_h and rad_s_next >= rad_h_next:
ans += 1
# 3. 분침이 초침보다 각도가 큰 상태에서, 1초 후에 초침의 각도가 더 커지는 경우
if rad_s < rad_m and rad_s_next >= rad_m_next:
ans += 1
start += 1
return ans
레퍼런스
- 깃허브 정답
'Algorithm > 구현' 카테고리의 다른 글
[프로그래머스] PCCP 모의고사 1회 2번 체육대회 (0) | 2023.12.13 |
---|---|
[프로그래머스] PCCP 모의고사 1회 1번 외톨이 알파벳 (0) | 2023.12.13 |
[프로그래머스 lv 1] PCCP 기출 1번 붕대감기 (0) | 2023.12.04 |
[백준] 16472번 고냥이 (투포인터 문제) (0) | 2023.11.03 |
[백준] 22988번 재활용 캠페인 (투포인터 문제) (1) | 2023.11.03 |
댓글