[백준 알고리즘] 백준 2869번: 달팽이는 올라가고 싶다 / 파이썬 Python3, PyPy3 (수학)
🔔 문제
출처 : https://www.acmicpc.net/problem/2869
😓 시행착오
⏲️ 첫 번째 시간 초과
# 시간 초과 코드 1 (이유 : while문 써서)
import sys
A, B, V = map(int, sys.stdin.readline().split())
snail = 0
day = 0
while snail < V:
snail = snail + A
snail = snail - B
if snail == V:
break
elif snail > V:
snail = snail + A
day += 1
print(day)
이 달팽이는 올라가고 싶다 문제는 수학 문제라는 것부터 나를 힘들게 했지만, 더 힘들게 했던건 시간 초과가 계속 뜨는 것…
사실 문제를 보고나서는 부족한 나의 생각으로 해볼 수 있는대로 코드를 짜다보니 시간 초과를 생각하지 못하고 while문으로 위와 같은 코드를 열심히 구현했다.
시간 초과가 뜨고나서야 이 코드가 잘못됐음을 인지했다.
그리고, 다른 방법을 찾아서 다시 코드를 짰다.
⏲️ 두 번째 시간 초과
# 시간 초과 코드 2
import sys
import math
A, B, V = map(int, sys.stdin.readline().split())
print(math.ceil((V-A) / (A-B)) + 1)
분명히 정답 처리 되어야 할 코드가 또 시간 초과가 떴다.
음…? 멘붕이 왔다. 🤯
현업에서 파이썬 개발자를 하고 계신 선배님께 여쭤보니 백준 서버에서 sys 모듈을 내장하고 있지 않기 때문에 sys모듈을 import하고 거기에서 sys.stdin.readline() 라는 3 depth를 거쳐 함수를 불러오고, 거기에 split() 함수까지 불러와서 시간초과가 뜨는 것 같다고 하셨다.
그래서…
🔐 해결 (소스 코드)
🔑 코드 1
import math
A, B, V = map(int, input().split())
print(math.ceil((V-A) / (A-B)) + 1)
############### 풀이 ###############
# 달팽이는 하루에 A-B만큼 올라간다
# 달팽이가 낮에 정상에 올라가면 더 이상 미끄러지지 않으므로
# 정상에서 A만큼 먼저 빼주고, 뺏던 하루를 더해줌
# 나눈 결과인 몫이 2.x, 3.x 와 같이 정수로 나누어 떨어지지 않는 경우가 있기 때문에
# math.ceil(x) 함수로 올림 하여 소수도 하루로 치도록 함
그냥 input()으로 바꿨더니 정답처리가 되었다.
그런데… 나는 분명히 sys.stdin.readline()이 input() 함수보다 속도가 빠르다고 알고 있었다.
그래서, 선배님께 이 부분에 대해서 또 여쭤보니 혹시 변수처리를 하면 정답처리가 될 수도 있지 않을까? 라고 하셨다.
그대로 시도해보았다.
🔑 코드 2
import sys
import math
input = sys.stdin.readline() # input이란 변수명으로 변수 처리를 해줌
A, B, V = map(int, input.split())
print(math.ceil((V-A) / (A-B)) + 1)
정답 처리가 되었고, 속도는 역시 input() 함수를 쓰는 것보다 더 빨랐다.
Leave a comment