🔔 문제

출처 : https://www.acmicpc.net/problem/2869

image


😓 시행착오

⏲️ 첫 번째 시간 초과

# 시간 초과 코드 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() 함수를 쓰는 것보다 더 빨랐다.

image

맨 위로 이동하기

Leave a comment