🐸 감상
우하하 내가 해냄!! 으하하하하하하하
아니 어제 풀이 안 찾아보면서 열심히 코드를 짰고!
예제 입 출력 다 잘 되는데!! 그래서 백준에 넣어 봤는데!! '틀렸습니다' 떠가지고
너무 절망했었움....... ㅜㅅㅜ
'아니 결과 너무 잘 나오는데 뭐가 문제야...! 이거 혹시 백준이 틀린 거 아냐????ㅜㅜㅜㅜㅜ'
하는 마음을 가지고 화재 대피 훈련을 가면서 그만뒀는데
오늘 아침에 랩실에 와서 다시 한번 풀어봤다.
위 글을 읽으면서 반례들을 찾았는데...!
역시.. 그래 컴퓨터가 잘 못 할리가 없지... 인간 잘못이지...^^
내가 짠 코드에 반례가 있었당ㅎㅅㅎ (자세한 코드 내용은 아래에서 설명하기로!)
'사실 다른 사람들 코드 이해 되니까 그거 넣고 다른 문제로 빠르게 넘어갈까..'
하는 못된 생각도 잠시 했었지만.. 그래봤자 늘지 않는 것은 나의 실력이니꽈...
열심히 다시 풀어봤다.
그러고 뚝딱뚝딱 만들어진 코드..! 답변에 넣어 봤더니...!!
'맞았습니다!'
아~~~~ 내가 이 맛에 풀지~~~ 희열이 대박이었다ㅎㅎㅎㅎㅎㅎ
헤헤 헤헤헤 헤헤헤헤 헤헤헿
🐸 문제
🐸 첫 번째 코드 (오답)
H, M = map(int, input().split())
if H>0:
a = int((H*60+M)-45)
print (a//60, end=' ') # 몫 = 시간
print (a%60, end=' ') # 나머지 = 분
else:
b = int((H+1440+M)-45)
print (b//60, end=' ')
print (b%60, end=' ')
첫 번째 작성했던 코드다.
1번 줄에 우선 H와 M을 받아준다. 문제에서 첫째 줄에 H와 M이 주어진다고 했으니까 한 줄에 숫자 두 개를 받기 위해서 split 함수를 사용해서 받아준다.
그런데 두 숫자 모두 '숫자'여야 하기 때문에 int 타입이어야 한다. 그렇기 때문에 map을 이용하여 두 숫자를 int 타입으로 변환해 준다.
그다음 내가 문제를 풀기 위해 했던 생각.
1) if H가 0보다 크다면?
일단 H에 60을 곱해서 분으로 만든 후, M을 더해준다. 그럼 총시간을 모두 분으로 합한 값이 나오게 되는데
이 값을 다시 60으로 나눠주면 몫은 시간(H)이고 나머지는 분(M)이 된다.
print에서 뒤에 end=' '을 넣어준 이유는 문제에서 출력을 한 줄에 하길 요구했기 때문이고, 그 구조가 H(공백)M 즉, 23시 22분이면 출력은 '23 22'로 되어야 했기 때문이다.
내가 print문을 두 개 사용하여 시간과 분을 따로 나누어 주었기 때문에 end=' '를 사용하지 않게 되면
두 줄로 print가 되게 된다. 그렇기 때문에 개행을 하지 않고 print 되는 문자 뒤에 공백 값을 넣주는 end=' '를 써 준 것이다.
이렇게 H가 0보다 큰 경우 print를 해주었고.
2) else (위의 경우가 아닌 나머지)
else는 시간이 0인 경우를 말한다.
입력 : 0 22 출력 : 23 37
입력 : 0 1 출력 : 23 16
이렇게 시간이 0시 일 때 45분을 빼게 되면 시간이 23시로 넘어가야 하기 때문에 24시간 즉 1440분을 임의로 더해주고, 시간과 분 또한 더해주었다. (사실 뒤에서 나오지만 시간은 더할 필요가 없다. 0이니까..)
그 후 45분을 빼 주면 총시간을 분으로 환산한 숫자가 나오고, 위의 경우와 같이 그 숫자를 60으로 나눴을 때
몫과 나머지가 각각 H와 M이 되는 코드를 작성하였다. 위 코드도 아주 잘 작동되었다... 그래서 문제가 없는 줄 알았는데....
반례가 있었다....!
바로 H가 0이면서 M이 45 거나 45보다 큰 경우...!
먼저 H가 0이면서 M이 45인 경우는
'0 0' 이 출력되어야 하는데
위에 내가 짠 식대로 하면.. 24 0 이 출력이 된다....!
H가 0이면서 45보다 큰 경우도 마찬가지! H가 24로 출력이 된다..
이 문제를 해결하기 위해 두 번째 코드를 작성하였다.
🐸 두 번째 코드 (정답)
a = int((H*60+M)-45)
print (a//60, end=' ') # 몫 = 시간
print (a%60, end=' ') # 나머지 = 분
elif (H==0 and M>= 45):
print ('0', end = ' ')
print (M - 45)
else:
b = int((H+1440+M)-45)
print (b//60, end=' ')
조건을 추가해 주었다...!
if와 else 부분은 위에와 같고, elif 부분을 추가해 주었다.
elif의 조건은 H가 0 이면서 M이 45보다 크거나 같을 때.
H를 무조건 0으로 출력해 주었고, 분은 M에서 45를 뺀 값으로 출력해 주었다.
이로서 '맞았습니다!'가 뜨게 되었다.....!
그런데 이 풀이를 작성하다 보니.... else의 b계산 부분을 더 간결하게 고칠 수 있어서 아래와 같이 최종적으로 작성해 주었다.
H, M = map(int, input().split())
if H>0:
a = int((H*60+M)-45)
print (a//60, end=' ') # 몫 = 시간
print (a%60, end=' ') # 나머지 = 분
elif (H==0 and M>= 45):
print ('0', end = ' ')
print (M - 45)
else:
b = int(1395+M)
print (b//60, end=' ')
print (b%60, end=' ')
그런데 사실.. 이 문제는 훨씬 쉽고 간결한 코드로 풀 수 있다... 나도 위의 코드는 내가 직접 생각한 데에 의의를 두고 다른 사람들의 코드를 열심히 들여다보면서 감탄하는 중이다....^^
위 문제의 깃헙!
'🖥️개발 > 🔍Baekjoon' 카테고리의 다른 글
[백준14681_파이썬(Python)] 사분면 고르기 (0) | 2023.04.04 |
---|---|
[백준11382_파이썬(Python)] 꼬마 정민 (0) | 2023.03.23 |
[백준 2588/ 파이썬(python)] 곱셈 (0) | 2023.03.23 |