파이썬 달팽이는 올라가고 싶다(백준 BOJ 2869)


문제

땅 위에 달팽이가 있다. 이 달팽이는 높이가 V미터인 나무 막대를 올라갈 것이다.

달팽이는 낮에 A미터 올라갈 수 있다. 하지만, 밤에 잠을 자는 동안 B미터 미끄러진다. 또, 정상에 올라간 후에는 미끄러지지 않는다.

달팽이가 나무 막대를 모두 올라가려면, 며칠이 걸리는지 구하는 프로그램을 작성하시오.


입력

첫째 줄에 세 정수 A, B, V가 공백으로 구분되어서 주어진다. (1 ≤ B < A ≤ V ≤ 1,000,000,000)


출력

첫째 줄에 달팽이가 나무 막대를 모두 올라가는데 며칠이 걸리는지 출력한다.


예제 입력 1

2 1 5

예제 출력 1

4

예제 입력 2

5 1 6

예제 출력 2

2

예제 입력 3

100 99 1000000000

예제 출력 3

999999901


📝 풀어보기

문제를 처음 봤을 땐 굉장히 쉬워보였다.

# A : 올라가는 거리 B : 미끄러지는 거리 V : 정상 위치
A, B, V = map(int, input().split())
cnt = 0 # 올라가기까지 걸린 일수
height = 0 # 올라가는 거리를 누적하기 위한 변수

while True:
    cnt += 1 # 일수 증가
    height += A # 높이 누적
    if height == V: # 높이가 정상 위치가 같을때 
        print(cnt) # 누적일수를 출력
        break
    height -= B # 밤에 B만큼 미끄러짐

하지만 문제는 시간 제한이었다. 이러한 경우는 짧은 범위의 계산은 빠르게 이뤄지지만 예제 입력 3같은 경우에는 시간이 너무 오래걸려 시간 초과가 발생한다.


✏️ 수정하기

📌 시간을 줄이기 위해 부등호로 비교를 하고 출력하는 방식은 사용하면 안된다. 먼저, sysmath 를 import한다.

import sys # readline()으로 입력받기위해
import math # 소수점 올림을 하기위해


📌 A : 올라가는 값, B : 미끄러지는 값, V : 정상 값 변수를 지정하고 sys.stdin.readline() 로 입력받는다. sys.stdin.readline()은 input()에 비해 반복적으로 여러개를 입력 받을때 더 빠르게 처리한다.

📌 c 에 (V-B) [정상값-미끄러지는값]/(A-B) [오르는값-미끄러지는값] 을 계산한다. V /(A-B)를 할 경우에는 정상 도착시 미끄러지는 값이 반영되지 않는다.

📌 print(math.ceil(c)) 로 올림된 값을 출력한다. (V-B)/(A-B)를 그대로 출력할 경우에 분수의 계산이기때문에 소수점이 나오는데, 일자에는 소수점이 없기때문이다.

A, B, V = map(int, sys.stdin.readline().split())
# A미터를 올라가고 B미터를 미끄러진다. 정상의 높이는 V미터
c = (V-B)/(A-B) # 정상-미끄러지는값 / 오르는값-미끄러지는값
                # (5-1) = 4 / ( 2-1 )= 1 = 4)
print(math.ceil(c))


전체 코드

import sys
import math

A, B, V = map(int, sys.stdin.readline().split())
# A미터를 올라가고 B미터를 미끄러진다. 정상의 높이는 V미터
c = (V-B)/(A-B) # 정상-미끄러지는값 / 오르는값-미끄러지는값
                # (5-1) = 4 / ( 2-1 )= 1 = 4)
print(math.ceil(c))

관심있을 포스팅