본문 바로가기
작업/Problem Solving

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

728x90

문제

땅 위에 달팽이가 있다. 이 달팽이는 높이가 V미터인 나무 막대를 올라갈 것이다.
달팽이는 낮에 A미터 올라갈 수 있다. 하지만, 밤에 잠을 자는 동안 B미터 미끄러진다.
또, 정상에 올라간 후에는 미끄러지지 않는다.

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

입력

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

출력

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

 

 


코드

 

import math #올림함수 사용
A, B, V = map(int, input().split())

print(math.ceil((V-A)/(A-B)+1))

 

시간 초과의 벽을 넘기 위해 단순화시켜야 하는 문제였습니다.
문제에서 의도한 것은 마지막에 달팽이가 올라갈 수 있는 거리를 모두 사용한다는 것입니다.


2 1 5 입력을 예로 든다면
1일은 2-1 = 1, 2일은 1 + (2-1) = 2, 3일은 2 + (2-1) = 3이 되지만
4일 차는 3 + 2 = 5로 밤에 미끄러지지 않고 정상에 도달할 수 있다는 것입니다.

 

해당 과정을 바탕으로 식을 구상해 보았습니다.
마지막 날에는 달팽이가 갈 수 있는 최대만큼 갈 수 있다고 한다면,
그 이전은 총 거리(5)에서 이동거리(2)를 뺀 값(3)에 도달하기 위한 날만 계산하면 되는 것입니다.


즉, 3에 도달하기 위해 소비된 3일이라는 값만 알아내면 나머지는 1일에 끝낼 수 있기 때문에
+1만 하면 된다는 것입니다.



정확히 떨어지지 않는 값이 있을 수 있기 때문에 처리가 필요합니다.
3 1 8 입력을 가정으로 한다면,
8까지 도달하기 위해서는 2, 4, 6의 거리에 도달하는 3일의 과정과,
1일에 8까지 도달하는 과정을 합한 4일이 요구됩니다.


"(V-A)/(A-B)+1"식에 대입하면 (V-A)/(A-B) = (5/2 = 2.5)의 소수점이 나오면서
정확한 일수 계산이 어려워집니다.



소수점이 생기는 이유는 마지막 날에 달팽이 이동거리의 최대치를 쓰지 않고서도
정상에 올라갈 수 있다는 의미와 같습니다.
그렇기 때문에 저 소수점의 시간도 1일이라고 산정합니다.
무조건 올림을 적용하는 것입니다.


그래서 math 모듈을 import 하여 올림 함수인 ceil() 함수를 적용하였습니다.

 

 

-끝-

 

 

 

 

728x90