티스토리 뷰
728x90
문제
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
풀이 아이디어
초반에는 두 시간 대 사이에 분당 2회씩 알람 숫자를 세고 if 문으로 예외 케이스에서는 알람 횟수를 더하거나 빼는 방식으로 진행하려고 하였으나 예외 케이스를 정의하고 조건문으로 확인하는 것에 있어서 어려움을 겪었다.
결국 다른 사람의 아이디어를 참조해서 문제 풀이를 마무리했다.
문제 풀이의 핵심 아이디어는 모든 경우의 수를 확인하여 숫자를 세는 것이었다. 시간은 24시간으로 한정되어 있으며 반복문도 한 번 밖에 사용되지 않아 시간 복잡도가 높지 않다. 두 지점 사이에 존재하는 매 초마다 시침, 분침, 초침의 각도를 비교하여 지나갔는지 여부를 판단하는 방식으로 문제를 해결하였다.
시침과 분침이 초침과 겹치는 경우는 다음과 같은 방법으로 판단한다.
- 1초 전 시침이나 분침이 초침보다 각도가 크지만 현 시점에서 초침의 각도가 더 커졌을 때.(시계의 숫자 12 기준 각도)
- 시침 혹은 분침이 초침과 겹칠 때
- 첫 번째 경우에서 현 시점의 초침이 0이 되어 각도가 0이 되었을 때
여기에 시침과 분침, 초침이 모두 겹치는 경우까지 고려하여 모든 순간에 대해 판단한다.
코드
# 총 시간을 가지고 각도 판단
def angle(t):
a_s = (t%60)*6
a_m = (t/10)%360
a_h = (t/120)%360
return a_h, a_m, a_s
# 시분초를 초로 변환
def time_sum(h, m, s):
return h*3600+m*60+s
def solution(h1, m1, s1, h2, m2, s2):
sum1 = time_sum(h1,m1,s1)
sum2 = time_sum(h2,m2,s2)
# 이전 시간 대 시침, 분침, 초침의 위치
p_h, p_m, p_s = 0,0,0
count = 0
# 두 지점 사이 모든 시간에 대한 반복문 시행
for i in range(sum1, sum2+1):
# 현재 시점에서 모든 바늘의 각도 확인
a_h, a_m, a_s = angle(i)
# 시침과 겹치는 경우
if a_h < a_s and p_h > p_s:
count+=1
elif a_h == a_s:
count+=1
elif p_h > p_s and a_s==0:
count+=1
# 분침과 겹치는 경우
if a_m < a_s and p_m > p_s:
count+=1
elif a_m == a_s:
count+=1
elif p_m > p_s and a_s==0:
count+=1
# 시침, 분침, 초침이 모두 겹치는 경우
if a_m==0 and a_h==0 and a_s==0:
count-=1
# 현재 각도를 이전 각도를 저장하는 변수에 저장
p_h, p_m, p_s = a_h, a_m, a_s
answer = count
return answer.
728x90
'알고리즘 > 코딩테스트' 카테고리의 다른 글
[백준] 7578번 공장 문제 풀이 (0) | 2024.10.28 |
---|---|
[백준]2447번 별 찍기 - 10 (0) | 2024.07.24 |
[프로그래머스]요격시스템 (1) | 2024.04.05 |
[프로그래머스] 도넛과 막대 그래프 (0) | 2024.03.28 |
[프로그래머스 코딩테스트][PCCP 기출문제] 2번 / 석유 시추 파이썬 문제 풀이 아이디어 (0) | 2024.03.27 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
TAG
- 프로그래머스
- ssafy기자단
- 알고리즘이론
- 인프런강의
- numpy
- 인프런강의후기
- SSAFY
- 오블완
- 알고리즘
- 백준
- 웹개발
- 제주코딩베이스캠프
- 코딩테스트
- dataframe
- 생성형 AI
- 티스토리챌린지
- 인프런
- django
- 위니브엠베서더
- 웹
- SSAFYcial
- 파이썬
- Python
- it도서큐레이션
- 더오름
- 백준알고리즘
- PANDAS
- 전자회로
- 웹프로그래밍
- 위니브
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
글 보관함
250x250