[Python] 백준 BaekJoon 2869

2021. 8. 21. 10:16Algorithm/BaekJoon

문제

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

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

또, 정상에 올라간 후에는 미끄러지지 않는다.

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

 

입력

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

(1 ≤ B < A ≤ V ≤ 1,000,000,000)

 

출력

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

 

 

[풀이법]

* 문제를 풀기전에 시간 제한을 눈여겨 볼 필요가 있다(0.15초)

 

정답 비율은 근거로 봤을 때, 문제를 처음 접한 대부분은 아래와 같이 생각했을 것이다

"올라간높이 - 떨어진 높이를 계산해서 전체 높이까지 몇 일이 걸릴까 ?"

 

결론부터 말하면 저렇게 생각하고 문제에 접근하면 예제 입력 3번같은 경우 답이 안나온다

(직접 해본 결과 몇 십초가 지나도 답을 구해내지 못하고 계속 연산만 수행한다)

즉, 올라간 높이에 비례해 떨어진 높이의 차가 적고 전체 높이가 클수록 계산이 힘들어진다

 

전체를 계산할 때에 한 번씩 계산할 것이 아닌, 한 번에 계산해야 한다

day = (height - fall) / (climb - fall)
→ day = (5 - 1) / (2 - 1) = 4 / 1 = 4

만약 height - fall의 연산 과정이 없다면, 전체 높이까지 climb 했음에도 fall을 할 것이다

(그렇게 되면 day가 원래의 답보다 +1이 되어서 나오게 된다)

 

위 식처럼 정상적으로 결과를 구하게 되면 답은 소수점으로 나오게 된다

이 때, 4.0은 4일이지만, 4.1은 5일이 되어야한다 (이해가 안되었다면 다시 생각해보자)

 

4.0은 4일이지만, 4.1, 4.2, 4.3 ··· 전부 5일이다

 

파이썬만의 기준이 있겠지만, 파이썬의 소수는 특이해서 경우에 따라 결과가 다르게 나온다

(정확한 이유는 모르겠지만 같은 4.5도 때에 따라 4로 반환될 수도, 5로 반환될 수도 있다)

 

위의 경우를 깔끔하게 정리시켜줄 수 있는 함수가 math.ceil( )이다

math 모듈을 import 해서 사용할 수 있으며, 4.1부터 모든 소수점은 한 자리 올림하여 5를 반환한다

 

import math
import sys
input = sys.stdin.readline

climb, fall, height = map(int, input().split())

day = (height - fall) / (climb - fall)
print(math.ceil(day))

* 혹시 몰라서 import sys ...

'Algorithm > BaekJoon' 카테고리의 다른 글

[Python] 백준 BaekJoon 2775  (0) 2021.08.24
[Python] 백준 BaekJoon 10250  (0) 2021.08.23
[Python] 백준 BaekJoon 1193  (0) 2021.08.20
[Python] 백준 BaekJoon 2292  (0) 2021.08.19
[Python] 백준 BaekJoon 1712  (0) 2021.08.19