[ 백준 ] 2869 달팽이는 올라가고 싶다 (python)
https://www.acmicpc.net/problem/2869
2869번: 달팽이는 올라가고 싶다
첫째 줄에 세 정수 A, B, V가 공백으로 구분되어서 주어진다. (1 ≤ B < A ≤ V ≤ 1,000,000,000)
www.acmicpc.net
문제
땅 위에 달팽이가 있다. 이 달팽이는 높이가 V미터인 나무 막대를 올라갈 것이다.
달팽이는 낮에 A미터 올라갈 수 있다. 하지만, 밤에 잠을 자는 동안 B미터 미끄러진다. 또, 정상에 올라간 후에는 미끄러지지 않는다.
달팽이가 나무 막대를 모두 올라가려면, 며칠이 걸리는지 구하는 프로그램을 작성하시오.
입력
첫째 줄에 세 정수 A, B, V가 공백으로 구분되어서 주어진다. (1 ≤ B < A ≤ V ≤ 1,000,000,000)
출력
첫째 줄에 달팽이가 나무 막대를 모두 올라가는데 며칠이 걸리는지 출력한다.
예제입력 1
2 1 5
예제출력 1
4
예제입력 2
100 99 1000000000
예제출력 2
999999901
🔥 문제 풀이
처음에 이 문제를 보고 단순하게 하루에 이동하는 양이 (a - b)니까 이 값이 v 보다 높을 때까지 count 하면 되는 거 아닌가? 생각하고 코드를 완성했는데 결과는 땡!
그 이유는 아침에 a만큼 이동했을 때, 이미 v에 도달했다면? 굳이 b만큼 내려갔다가 다음날 다시 올라올 이유가 없다!
그리고 시간 초과도 남!
그래서 수식으로 문제를 푸는 방법을 생각해봤음
day = v / (a - b) 이렇게 하루에 이동하는 양으로 나누는 방법!
하지만 이 방법으로 진행하면 위에서 말했듯이 낮에 v에 도달했다가 다시 b만큼 내려가야 하는 경우가 생기게 된다
따라서 수식은 day = (v - b) / (a - b) 이 된다.
이 수식에서 소수점 수가 나오면 올림 처리해줘야하기 때문에 ceil 함수를 이용해줬다
(예를 들어 day 값이 3.5가 나오면 올림 해서 4일로 출력하기)
* math 모듈 - ceil(), floor() 함수
- ceil() : 실수를 입력하면 올림하여 정수를 반환해주는 함수
- floor() : 실수를 입력하면 내림하여 정수를 반환해주는 함수
import sys, math
input = sys.stdin.readline
a, b, v = map(int, input().split())
day = (v - b) / (a -b)
print(math.ceil(day))