p_아날로그 시계_250135
| source | school.programmers.co.kr/learn/course... |
| type | 📌 개발노트 |
| topics | 600-알고리즘 & 코딩테스트 601 구현 & 완전탐색 |
| types | 문제풀이 |
| 정답여부 | 틀림 |
문제
초침 기준으로 분침과 시침이 겹치면 알람이 울린다.
울리는 알람의 횟수를 알려줘
답
주의점 시침과 분침이 겹치면 1번으로 고려한다.
1차답
"""
시분초침이잇음용
속도는 일정
시침 분침 겹칠때마다알림
초침이 시침or분침과 겹치면알람울림
start각도를 구함
구간임
"""
def solution(h1, m1, s1, h2, m2, s2):
difS = (h2*3600+m2*60 +s2)- (h1*3600+m1*60 +s1)
# 초앵글을 기준으로 리셋시킴
h_angle = h1 * 30 + m1 * 0.5 + s1 * 0.5/60
m_angle = m1 * 6 + s1 * 6/60
s_angle = s1 * 6
h_angle -= s_angle
m_angle -= s_angle
if h_angle<0: h_angle += 360
if m_angle<0: m_angle += 360
s_angle = 0
# print(difS,h_angle,m_angle,s_angle)
# 일자로 생각해보셈 속력을 구하자
# 1도 도는데 속력 sec기준
# 함수로 생각해보셈 x초에 만난다.
# 최대2번임 x가 음수면 안만남요
h_speed = 30/3600
m_speed = 6/60
s_speed = 360/60
# h_angle + x*h_speed = s_angle + x*s_speed
# h_angle-s_angle = x(s_speed-h_speed)
# 360
answer = 0
# 1분에 초가 360도도니깐 1분이기준이 되어야합니다 븅띤아!
# 1분에 분침은 6도를돈다.
while difS >= 60:
limit = 60
difS -= 60
flag = False
xh = round((h_angle)/(s_speed-h_speed),4)
xm = round((m_angle)/(s_speed-m_speed),4)
h_angle,m_angle = add_angel_by_minute(h_angle,m_angle)
if 0<=xh and xh<60:
flag = True
answer += 1
# print(xh)
if 0<=xm and xm<60:
flag = True
answer += 1
if flag and xh == xm:
answer -= 1
# print("중복일치",xh,xm)
# print(xh,xm,difS,flag,answer,h_angle,m_angle)
if difS > 0:
limit = difS
flag = False
xh = round((h_angle)/(s_speed-h_speed),4)
xm = round((m_angle)/(s_speed-m_speed),4)
h_angle,m_angle = add_angel_by_minute(h_angle,m_angle,difS/60)
if 0<=xh and xh<=difS:
flag = True
answer += 1
# print(xh)
if 0<=xm and xm<=difS:
flag = True
answer += 1
if flag and xh == xm:
answer -= 1
# print("중복일치",xh,xm)
# print(xh,xm,difS,flag,answer,h_angle,m_angle)
return answer
def add_angel_by_minute(h_angle,m_angle,time = 1):
h_angle += 0.5/time
m_angle += 6/time
if h_angle >= 360: h_angle -= 360
if m_angle >= 360: m_angle -= 360
return [h_angle,m_angle]
30 179.75 177.0 0
30.000000000000004 29.999999999999996 -30 True 1
다음과같은 문제가 있다.
- 시작 지점인 h1 m1 s1으로 잡으면 마지막 구간을 판별을 못하고 마지막 지점인 h2 m2 s2로 잡으면 시작 구간을 판별하지 못합니다. (테스트 케이스 19번 문제)
생각해보니 0시정각인데
0, 0, 0, 23, 0, 0
2735
2차답
역시사람들은 뻐킹진어스하다.
60초만남았을때 즉
0이상 60초미만인상황에서
0<=t<60초만세고 60초 즉 다시 0초된상황을 포함시지않았던것이 문제였다.
def solution(h1, m1, s1, h2, m2, s2):
difS = (h2*3600+m2*60 +s2)- (h1*3600+m1*60 +s1)
# 초앵글을 기준으로 리셋시킴
h_angle = h1 * 30 + m1 * 0.5 + s1 * 0.5/60
m_angle = m1 * 6 + s1 * 6/60
s_angle = s1 * 6
h_angle -= s_angle
m_angle -= s_angle
if h_angle<0: h_angle += 360
if m_angle<0: m_angle += 360
s_angle = 0
# print(difS,h_angle,m_angle,s_angle)
# 일자로 생각해보셈 속력을 구하자
# 1도 도는데 속력 sec기준
# 함수로 생각해보셈 x초에 만난다.
# 최대2번임 x가 음수면 안만남요
h_speed = 30/3600
m_speed = 6/60
s_speed = 360/60
# h_angle + x*h_speed = s_angle + x*s_speed
# h_angle-s_angle = x(s_speed-h_speed)
# 360
answer = 0
# 1분에 초가 360도도니깐 1분이기준이 되어야합니다 븅띤아!
# 1분에 분침은 6도를돈다.
while difS > 60:
limit = 60
difS -= 60
flag = False
xh = round((h_angle)/(s_speed-h_speed),4)
xm = round((m_angle)/(s_speed-m_speed),4)
h_angle,m_angle = add_angel_by_minute(h_angle,m_angle)
if 0<=xh and xh<60:
flag = True
answer += 1
# print(xh)
if 0<=xm and xm<60:
flag = True
answer += 1
if flag and xh == xm:
answer -= 1
# print("중복일치",xh,xm)
# print(xh,xm,difS,flag,answer,h_angle,m_angle)
if difS > 0:
limit = difS
flag = False
xh = round((h_angle)/(s_speed-h_speed),4)
xm = round((m_angle)/(s_speed-m_speed),4)
h_angle,m_angle = add_angel_by_minute(h_angle,m_angle,difS/60)
if 0<=xh and xh<=difS:
flag = True
answer += 1
# print(xh)
if 0<=xm and xm<=difS:
flag = True
answer += 1
if flag and xh == xm:
answer -= 1
# print("중복일치",xh,xm)
# print(xh,xm,difS,flag,answer,h_angle,m_angle)
return answer
def add_angel_by_minute(h_angle,m_angle,time = 1):
h_angle += 0.5/time
m_angle += 6/time
if h_angle >= 360: h_angle -= 360
if m_angle >= 360: m_angle -= 360
return [h_angle,m_angle]
코드최적화
def solution(h1, m1, s1, h2, m2, s2):
difS = (h2*3600+m2*60 +s2)- (h1*3600+m1*60 +s1)
# 초 앵글을 기준으로 리셋시킴 즉 초앵글이 12로 가게끔.
s_angle = s1 * 6
m_angle = m1 * 6 + s1 * 6/60 - s_angle
h_angle = h1 * 30 + m1 * 0.5 + s1 * 0.5/60 - s_angle
if h_angle<0: h_angle += 360
if m_angle<0: m_angle += 360
s_angle = 0
# print(difS,h_angle,m_angle,s_angle)
# 일자로 생각해보셈 속력을 구하자
# 속력 per 초
# 단 초가 0~60사이 여야함. 한바뀌단위로 측정해야함.ㅇㅇ
h_speed = 30/3600
m_speed = 6/60
s_speed = 360/60
# h_angle + x*h_speed = s_angle + x*s_speed
# >> h_angle - s_angle = x(s_speed-h_speed)
answer = 0
# 1분에 초가 360도도니깐 1분이기준이 되어야 함.
while difS > 0:
isPassed = False
isEnd = False
if difS <= 60 :
isEnd = True
limit = difS if isEnd else 60
difS -= 60
xh = round((h_angle)/(s_speed-h_speed),4)
xm = round((m_angle)/(s_speed-m_speed),4)
h_angle,m_angle = add_angel_by_minute(h_angle,m_angle)
if 0<=xh and (xh<limit or (isEnd and xh == limit)):
isPassed = True
answer += 1
if 0<=xm and (xm<limit or (isEnd and xm == limit)):
isPassed = True
answer += 1
if isPassed and xh == xm:
answer -= 1
# print("중복일치",xh,xm)
# print(xh,xm,difS,flag,answer,h_angle,m_angle)
return answer
def add_angel_by_minute(h_angle,m_angle,time = 1):
h_angle += 0.5/time
m_angle += 6/time
if h_angle >= 360: h_angle -= 360
if m_angle >= 360: m_angle -= 360
return [h_angle,m_angle]