ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 백준 > Python3 > 5675번 : 시침과 분침
    알고리즘/쉬운 문제 2020. 2. 26. 00:19

    오늘의 포스팅은 5675번으로 시침과 분침 문제를 풀어보겠습니다.

    이번 문제에서는 3가지 풀이를 만들어보겠습니다.

    먼저, 직관적으로 푸는 방법이고.

    두번째는 1번 풀이를 이용해서 실행시간을 단축시키는 방법을 이용한 풀이이고

    마지막은 조금 다른 관점으로 풀어서 숏코딩을 위한 테크닉을 적용시켜보겠습니다!!

    문제

    상근이 방에 걸려있는 시계는 완벽한 원 모양이다. 시계에는 시침과 분침이 원의 중심을 기준으로 돌아가고 있다. 시침은 시를 나타내고, 분침은 분을 나타낸다. 시계에는 60개의 눈금이 지름을 따라서 표시되어 있다. 눈금과 눈금 사이의 거리는 모두 같다.

    분침은 1분에 한 번씩 다음 눈금으로 이동한다. 시침은 12분에 한 번식 다음 눈금으로 이동한다. 즉, 1시간이 지나면 다섯 눈금을 이동하게 된다. 이 시계는 시나 분이 바뀌는 순간 즉시 다음 눈금으로 이동한다. 즉, 시침과 분침은 항상 눈금을 가리키고 있으며, 그 사이를 가리키는 경우는 없다.

    자정은 시침과 분침이 동시에 가장 윗 눈금을 가리킬 때이다. 즉, 0시와 0분을 나타낸다. 12시간 또는 720분이 지나면, 시침과 분침은 다시 같은 위치로 오게 된다. 이러한 움직임은 계속해서 반복된다. 

    생각해보면, 분침이 움직였을 때 시침이 움직이지 않을 수 있다. 하지만, 시침이 움직였다면 항상 분침도 움직였을 것이다.

    상근이는 기하를 매우 좋아한다. 따라서, 시계를 볼 때마다 시침과 분침이 이루는 각도를 계산해서 종이에 적어놓는다. 이렇게 몇 년이 지나다보니 종이에는 엄청나게 많은 각도가 적혀져 있었다. 종이를 살펴보던 상근이는 어떤 각도는 반복해서 나오는데, 어떤 각도는 절대 나오지 않는다는 사실을 알게 되었다. 예를 들면, 3시와 9시일 때 시침과 분침이 이루는 각도는 90도이다. 하지만, 65도를 이루는 시간은 없다.

    상근이는 시침과 분침이 이루는 각도가 A가 되는 경우가 있는지 없는지를 검사해보려고 한다. 0보다 크거나 같고, 180보다 작거나 같은 정수 A가 주어졌을 때, 상근이의 시계가 각도 A를 이루는 시간이 있는지 없는지를 구하는 프로그램을 작성하시오.

    입력 / 출력

    더보기

    입력

    입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스는 한 줄이고, 정수 A가 입력으로 주어진다. (0 ≤ A ≤ 180)

    출력

    각 테스트 케이스에 대해서, 상근이의 시계의 시침과 분침이 이루는 각도가 A도가 되는 경우가 있다면 Y를, 아니면 N을 출력한다.

     

    예제입력1 예제출력1
    90
    65
    66
    67
    128
    0
    180
    Y
    N
    Y
    N
    N
    Y
    Y

     

    풀이

    1. 먼저 가장 간단하게 풀 수 있는 방법으로 시침과 분침을 각각 수치화하는거에요.

    단순하게 시침과 분침을 수치화해서 0시부터 24시까지 루프로 돌려보는거에요.

    그렇게 루프를 도는 과정에서 각 수치에 대응하는 각도를 추하고

    그 수치들의 차이를 하나의 리스트나 집합에 저장해놓고 입력으로 들어오는

    값들이 이 집합에 존재하는지를 체크해보는거에요.

     

    h_ang=-6
    m_ang=-6
    angs=set()
    for hour in range(24):
        for minute in range(60):
            m_ang = (m_ang+6)%360
            if m_ang % 72 == 0:
                h_ang = (h_ang+6)%360
            # print("%02d시(%d) %02d분(%d)"%(hour, h_ang, minute, m_ang))
            # 이 라인을 이용해서 전체 시간과 그에 해당하는 각을 체크할 수 있습니다.
            b_ang=(h_ang-m_ang)%360
            the_other=360-b_ang
            angs.add(min(b_ang,the_other))
    angs=list(angs)
    for i in sys.stdin.readlines():
    	if int(i.strip()) in angs:
        	print("Y")
        else:
        	print("N")

    2. 실행타임을 줄이는 방법!!

    별거 없어요~~ angs프린트하면 리스트가 나오죠??

    그걸 그냥 코드에 넣어서 사용하는 방법이에요.

    궂이 코드를 돌려서 구해낼 필요없겠죠??

    이 문제의 경우에는 시간이 별로 차이나지 않겠지만

    문제에 따라서 엄청 차이나는 경우도 존재하니까. 알아두면 괜찮아요^^

    angs=[0,132,6,138,12,144,18,150,24,156,30,162,36,168,42,174,48,180,54,60,66,72,78,84,90,96,102,108,114,120,126]
    #여기는 1번 결과의 절반만 들어가있어요. 위에서는 0-360도 범위를 구해넣었는데 여기서는 절반만 넣었어요.
    #어차피 입력값이 0-180도이까요^^
    for i in sys.stdin.readlines():
    	if int(i.strip()) in angs:
        	print("Y")
        else:
        	print("N")	

    3. 마지막 숏코딩!을 위한 기법!!

    숏코딩에는 여러가지 방법이 있는데요.

    여기서 알려드릴건 True / False에 따라서 Y/N와 같은 한문자를 출력하는 경우에요.

    물론 0/1도 가능해요.

     

    보통은 if 구문으로 구현을 하지만 궂이 그럴 필요가 없다는거!

    어차피 조건문의 입력값은 두가지로 0/1 = False/True입니다~

    그러면 이 두가지를 문자열에 입력하면 어떻게 될까요??

    index가 0 or 1이 되겠죠??

    코드로 본다면

     

    print("NY"[cond])

    만약 cond에 True이면 index가 1이 되어서 Y가 출력되고

    False의 경우에는 N가 출력되겠죠??

     

    여기서는 한문자라서 이렇게 축약이 가능하지만 만약 "합격" 이나 "불합격"을

    출력하려면 어떻게 해야할까요??

     

    print(("불합격", "합격")[cond])

    이렇게 하면 [cond]의 구문이 앞의 ( "불학격", "합격" ) 튜플에서 선택하겠죠??

    물론 리스트를 사용하셔도 되구요. 근데 뒤의 인덱스 신택스랑 구분이 되서 저는 튜플이 좋더라구요.

    주의할점은 튜플의 내용은 바뀔 수 없다는거에요. 이런 경우에는 바뀔일이 없지만요.

     

    아무튼! 이렇게 해주시면 코드의 길이가 왕창 짧아져요^^

     

    그리고 여기서는 조금 다른 접근법을 사용했는데요!

    저는 이렇게 풀지 않았지만 다른 사람들의 코드를 보고 감탄하고 이렇게 적고 있어요ㅎ

    풀이 방법은 간단한데 시계에서 나오는 시침과 분침의 각은 무조건 6의 배수라네요 ^^bb

    import sys
    for i in sys.stdin:print("NY"[int(i)%6==0])

     

    간-단-

    편-안-

    끝-

     

     

     

    5675번: 시침과 분침

    문제 상근이 방에 걸려있는 시계는 완벽한 원 모양이다. 시계에는 시침과 분침이 원의 중심을 기준으로 돌아가고 있다. 시침은 시를 나타내고, 분침은 분을 나타낸다. 시계에는 60개의 눈금이 지름을 따라서 표시되어 있다. 눈금과 눈금 사이의 거리는 모두 같다. 분침은 1분에 한 번씩 다음 눈금으로 이동한다. 시침은 12분에 한 번식 다음 눈금으로 이동한다. 즉, 1시간이 지나면 다섯 눈금을 이동하게 된다. 이 시계는 시나 분이 바뀌는 순간 즉시 다음 눈금으로

    www.acmicpc.net

Designed by Tistory.