[BAEKJOON][문자열1]-C-경고(3028번)
https://www.acmicpc.net/problem/3029
3029번: 경고
첫째 줄에 현재 시간이 hh:mm:ss 형식으로 주어진다. (시, 분, 초) hh는 0보다 크거나 같고, 23보다 작거나 같으며, 분과 초는 0보다 크거나 같고, 59보다 작거나 같다. 둘째 줄에는 나트륨을 던질 시간
www.acmicpc.net
먼저, 문제에 대해 말하기 전에 힌트를 던진다.
혹여, 문제가 안풀려 힌트를 얻고자 들어오신 분이 있다면, 힌트만 보고 다시 해보시길!
시분초는 '초'로 단위를 통일할 수있다.
조건에 정인이는 무조건 1초 이상 기다린다.
아래는 오답이다.
입력값과 출력 값을 대부분 비슷하게 맞췄으나, 결국 틀렸다.
아래처럼 시간 값을 빼는 것을 일일이 써주어도 계산이 된다.
아래 방식대로해서 오답을 고치진 않았으나, 생각과정 자체는 맞았다.
currnettime = input()
currnethour = int(currnettime[0:2])
currnetmin = int(currnettime[3:5])
currnetsec = int(currnettime[6:8])
Jtime = input()
Jhour = int(Jtime[0:2])
Jmin = int(Jtime[3:5])
Jsec = int(Jtime[6:8])
waithour = Jhour - currnethour
waitmin = Jmin - currnetmin
waitsec = Jsec - currnetsec
if (waithour >= 0) & (waitmin >= 0) & (waitsec < 0):
waitmin = waitmin - 1
waitsec = waitsec + 60
elif (waithour >= 0) & (waitmin < 0) & (waitsec < 0):
waithour = waithour - 1
waitmin = waitmin + 60 - 1
waitsec = waitsec + 60
elif (waithour >= 0) & (waitmin < 0) & (waitsec >= 0):
waithour = waithour - 1
waitmin = waitmin + 60
elif (waithour < 0) & (waitmin >= 0) & (waitsec >= 0):
waithour = waithour + 24
elif (waithour < 0) & (waitmin >= 0) & (waitsec < 0):
waithour = waithour + 24
waitmin = waitmin - 1
waitsec = waitsec + 60
elif (waithour < 0) & (waitmin < 0) & (waitsec < 0):
waithour = waithour + 24 - 1
waitmin = waitmin + 60 - 1
waitsec = waitsec + 60
#예를 들어 03:15:20 - 20:18:35 = 6:57:45:
elif (waithour < 0) & (waitmin < 0) & (waitsec >= 0):
waithour = waithour + 24 - 1
waitmin = waitmin + 60
else:
pass
waithour = '%02d' %waithour
waitmin = '%02d' %waitmin
waitsec = '%02d' %waitsec
resttime = waithour + ':' + waitmin + ':' + waitsec
print(resttime)
아래 코드가 정답이다.
위에서 힌트로 언급하였지만, 이 문제에는 맹점이 있다.
문제를 잘 읽어야한다.
정인이는 적어도 1초를 기다리며, 많아야 24시간을 기다린다.
즉, 시분초가 같다면! 정인이는 24시간을 기다려야한다.
❗️ 이 부분이 가장 중요하다. 처음에 이 부분을 적용을 시키지 못해서 틀렸다.
시분초가 같을때 정인이는 하루 전 같은 시각에 숨어있는거다.
이 부분을 캐치 못해서 애꿎은 코드만 계속 수정했다.
def totalsec():
time = input().split(':')
time_hh = int(time[0])
time_mm = int(time[1])
time_ss = int(time[2])
time_totalsec = (time_hh * 3600) + (time_mm * 60) + time_ss
return time_totalsec
def resttime():
ntime = totalsec()
jtime = totalsec()
rtime = jtime - ntime
if rtime < 0:
rtime = rtime + (24 * 3600)
elif rtime == 0:
rtime = 24 * 3600
else:
pass
hh = rtime // 3600
mm = (rtime % 3600) // 60
ss = (rtime % 3600) % 60
hh = '%02d' %hh
mm = '%02d' %mm
ss = '%02d' %ss
resttime = hh + ':' + mm + ':' + ss
return resttime
print(resttime())
#resttime = (lambda x : '0' + x if len(x) < 8 else x)(str(datetime.timedelta(seconds= rtime)))
#print(resttime)
위 정답 코드를 보면 마지막 두 줄이 보일 것이다.
resttime = (lambda x : '0' + x if len(x) < 8 else x)(str(datetime.timedelta(seconds= rtime)))
print(resttime)
이 두 줄은 람다와 datatime 라이브러리를 사용해서 시간 차를 구해주는 부분이다.
처음에는 이걸로 했을때 정담이 나온다고 생각하였으나,
시분초, 시각이 같은 경우에 24시간을 정인이가 기다리는 경우
즉, 출력값이 24:00:00 으로 나와야하는데
위 코드를 사용할 경우 1day, 00:00:00 으로 출력되어 사용할 수 없었다.
아래는 친구가 푼 코드이다. 훨씬 간결하고 효율적이다.
timeNow = input()
timeThrow = input()
Nh,Nm,Ns=map(int,timeNow.split(":"))
Th, Tm, Ts = map(int,timeThrow.split(":"))
T1 = Nh*3600+Nm*60+Ns
T2 = Th*3600+Tm*60+Ts
if T2-T1>0:
answer = T2-T1
else:
answer = (T2-T1)+24*3600
h,m, s = answer//3600, answer//60%60,answer%60
print("%02d:%02d:%02d" %(h,m,s) )
생각자체는 같았으나, 파이썬의 특징을 잘 이용하여 간결하게 만들었다.
나도 저렇게 코드를 간결하게 짜는 연습을 해야겠다.
우선 정답을 맞춰서 짜보고, 그 다음에 간결화할 수 있도록 코드를 복기해볼 것!
https://github.com/Headfish96/Algorithm.git
GitHub - Headfish96/Algorithm: Algorithm That I study
Algorithm That I study. Contribute to Headfish96/Algorithm development by creating an account on GitHub.
github.com