본문 바로가기

문제풀이

[백준] 1408번 파이썬 풀이

https://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)에 맞춰 출력한다.

[예제 입력1]

13:52:30
14:00:00

[예제 출력1]

00:07:30

나의 풀이

 

hour1, min1, sec1 = map(int, input().split(":"))
hour2, min2, sec2 = map(int, input().split(":"))

total = (hour2*3600 + min2*60 + sec2) - (hour1*3600 + min1*60 + sec1)

if total < 0:
    total += 60*60*24

real_hour = total // 3600
real_min = (total%3600)//60
real_sec = total%60

print("%02d:%02d:%02d" % (real_hour,real_min,real_sec))

 

 해당 문제를 가장 쉽게 풀이할 수 있는 방법은 입력받은 시간을 모두 초(sec)로 변환하여 계산한 뒤에 시:분:초로 출력하는 것이다.

 

우선 현재 시간과 임무를 시작한 시간을 입력받고, 해당 시간들을 모두 초(sec)로 계산한 뒤 (임무 시작시간 - 현재 시간)으로 계산하여 total이라는 변수에 저장해준다.

 - 1시간 : 3600초, 1분 : 60초

 

hour1, min1, sec1 = map(int, input().split(":"))
hour2, min2, sec2 = map(int, input().split(":"))

total = (hour2*3600 + min2*60 + sec2) - (hour1*3600 + min1*60 + sec1)

 

만약에 임무 시작시간 - 현재 시간이 0보다 작은 값이 나오게 된다면 24시간(3600초*24)*초(sec)를 더해준다. 그 이유는 남은 시간이 00:00:00 ~ 23:59:59의 형태로 주어지기 때문이다.

 

if total < 0:
    total += 60*60*24

 

 그리고 가장 중요한 시/분/초 계산을 해주면 된다.

  1. 시간 : 전체 값이 초(sec)로 저장된 total 변수를 3600초로 나눈 값.

  2. 분 : 전체 값을 3600초로 나눈 나머지를 60으로 나눈 값.

  3. 초 : 전체 값을 60으로 나눈 나머지 값.

 

real_hour = total // 3600
real_min = (total%3600)//60
real_sec = total%60

 

마지막은 남은 시간을 표현해주는 방식으로 00:00:00의 형태로 출력을 해주어야 하기 때문에 "%02d"%(변수)를 사용하여 표현해주면 끝이 난다.

 

print("%02d:%02d:%02d" % (real_hour,real_min,real_sec))

실행 결과