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]