ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준] 1408번 24
    Algorithm Study/Python 2021. 5. 2. 03:33

    www.acmicpc.net/problem/1408

     

    1408번: 24

    도현이는 Counter Terror Unit (CTU)에서 일하는 특수요원이다. 도현이는 모든 사건을 정확하게 24시간이 되는 순간 해결하는 것으로 유명하다. 도현이는 1시간 만에 범인을 잡을 수 있어도 잡지 않는

    www.acmicpc.net

     

    문제

    도현이는 Counter Terror Unit (CTU)에서 일하는 특수요원이다. 도현이는 모든 사건을 정확하게 24시간이 되는 순간 해결하는 것으로 유명하다. 도현이는 1시간 만에 범인을 잡을 수 있어도 잡지 않는다. 정확하게 24시간이 되는 순간이 아니면 잡지 않는 CTU 특수요원이다.

    2008년 3월 3일 월요일, CTU는 새학기에 맞춰 핵폭탄을 날리겠다는 테러 정보를 입수했다. CTU에서는 특수요원 도현이에게 이 임무를 맡겼다. CTU의 프로그래머 준규는 이 사건의 배후가 김선영이란 것을 해킹을 통해 밝혀내었다.

    도현이는 선영이를 임무를 시작한지 정확하게 24시간이 되는 순간에 잡으려고 한다.

    만약 지금 시간이 13:52:30이고, 임무를 시작한 시간이 14:00:00 이라면 도현이에게 남은시간은 00:07:30 이다.

    모든 시간은 00:00:00 ~ 23:59:59로 표현할 수 있다. 입력과 출력에 주어지는 모든 시간은 XX:XX:XX 형태이며, 숫자가 2자리가 아닐 경우에는 0으로 채운다.

    도현이가 임무를 시작한 시간과, 현재 시간이 주어졌을 때, 도현이에게 남은 시간을 구하는 프로그램을 작성하시오.

     

    입력

    첫째 줄에는 현재 시간이, 둘째 줄에는 도현이가 임무를 시작한 시간이 주어진다. 임무를 시작한 시간과 현재 시간이 같은 경우는 주어지지 않는다.

     

    출력

    첫째 줄에 도현이가 임무를 수행하는데 남은 시간을 문제에서 주어지는 시간의 형태 (XX:XX:XX)에 맞춰 출력한다.

     

     

    풀이

    이 문제는 처음 입력받은 시간과 뒤에 입력 받은 시간의 차이를 계산하는 문제라고 할 수 있다.
    시 분 초를 따로 입력받기 때문에 초부터 계산을해서 더 작은 경우 분에서 60초를 빌려오고 분이 더 작은 경우
    시간에서 60분을 빌려오는 식으로 계산할 수 있지만 모두 초로 바꿔서 계산하면 더 쉽게할 수 있다.

     

    import sys
    
    now = list(map(int, sys.stdin.readline().strip().split(":")))
    target = list(map(int, sys.stdin.readline().strip().split(":")))
    
    now_sec = now[0]*3600 + now[1]*60 + now[2]
    target_sec = target[0]*3600 + target[1]*60 + target[2]

    리스트의 0번에는 시간 1번에는 분 2번에는 초가 입력되어있다.
    시간 * 3600 + 분 * 60 + 초를 이용하여 전체 값을 초로 변경하였다.

    temp = target_sec - now_sec
    
    if temp < 0 :
        temp += 60*60*24

    이제 단순하게 차를 구하면 된다.
    주의할 점은 target이 now보다 크기가 작은 경우이다. 예를 들어 target이 12시 now가 11시라면 1시간이 나오지만
    target이 11시 now가 12시라면 temp값은 -1이 나오고 결과는 23시간이 나와야하는 것이다.
    즉, temp값이 0보다 작은 경우에는 24시간에 해당하는 초(24*60*60)을 더해서 값을 변경해줘야한다.

    h,m = divmod(temp,3600)
    m,s = divmod(m,60)

    그 후 초를 3600 , 60 으로 나눠서 몫과 나머지를 (시간 분) , (분 초)로 입력받으면 된다.

    결과 값이 10보다 작은 경우에는 앞에 0을 채워줘야하기 때문에 zfill기능을 이용하여 2자리수씩 맞춰줬다.

    print(str(h).zfill(2)+":"+str(m).zfill(2)+":"+str(s).zfill(2))

     

     

    전체 코드

    import sys
    
    now = list(map(int, sys.stdin.readline().strip().split(":")))
    target = list(map(int, sys.stdin.readline().strip().split(":")))
    
    now_sec = now[0]*3600 + now[1]*60 + now[2]
    target_sec = target[0]*3600 + target[1]*60 + target[2]
    
    temp = target_sec - now_sec
    
    if temp < 0 :
        temp += 60*60*24
    
    h,m = divmod(temp,3600)
    m,s = divmod(m,60)
    
    print(str(h).zfill(2)+":"+str(m).zfill(2)+":"+str(s).zfill(2))

     

    댓글

From BlackHair