백준2869 별(파이썬)
백준2869 별(파이썬)
https://www.acmicpc.net/problem/2869
문제
땅 위에 달팽이가 있다. 이 달팽이는 높이가 V미터인 나무 막대를 올라갈 것이다.
달팽이는 낮에 A미터 올라갈 수 있다. 하지만, 밤에 잠을 자는 동안 B미터 미끄러진다. 또, 정상에 올라간 후에는 미끄러지지 않는다.
달팽이가 나무 막대를 모두 올라가려면, 며칠이 걸리는지 구하는 프로그램을 작성하시오.
입력
첫째 줄에 세 정수 A, B, V가 공백으로 구분되어서 주어진다. (1 ≤ B < A ≤ V ≤ 1,000,000,000)
출력
첫째 줄에 달팽이가 나무 막대를 모두 올라가는데 며칠이 걸리는지 출력한다.
코드
import math
import sys
input=sys.stdin.readline
A,B,V=map(int,input().split())
day=math.ceil((V-A)/(A-B))+1
print(day)
풀이
처음에는 그냥 while문안에서 A만큼 오르고 B만큼 내려오고 다시 A만큼 오를때 day를 추가하는 방식으로 풀었고 시간초과가 나왔다.
그래서 반복문을 거치지 않고 day를 구해야하는데 V에 도달하는 식을 살펴보면
V=((A-B)*day)+A 로 낮에 A만큼 오르고 밤에 다시 B만큼 떨어지고 그걸 day만큼 반복하고 다시 낮에 A만큼 올랐을때 V에 도달한다.
이를 토대로 day를 구하면 day=(V-A)/(A-B) 이렇게 나온다
이때 day=((V-A)/(A-B))+1 에서 1을 더해준 이유는 이미 day를 구할때 마지막에 다시 낮에 A만큼 올라간다고 가정했기 때문에 하루를 더해준다.
그리고 math.ceil은 올림함수로 만약 나눗셈 결과가 4.2로 나올 경우 4일이 아닌 5일로 취급해야하기 떄문이다.