For Programmer
백준 2869번 파이썬 문제풀이(기본수학 - 달팽이는 올라가고 싶다) -상세풀이 본문
-> 이 문제의 키포인트는 무엇일까? 입력받는 수의 범위가 10억까지인데 시간제한은 0.15초이다. 즉, 반복문으로 풀라는 소리가 아니다. 그러면 수학적 식을 찾아야하는데 식을 어떻게 찾을 수 있을까?
a(낮에올라가는높이) , b(밤에 미끄러지는 높이) , v(올라가야되는 높이),count(마지막날을 제외한 올라간 횟수) 를 놓고 식을 짜보겠다.
v <= (a-b * count) + a 이다. 즉 무엇이냐면 v(올라가야되는 높이) 보다 ((a-b):하루에 올라갈 수 있는 높이) * (마지막날을 제외한 횟수)에 마지막날 a만큼 오르는 것을 더해준 값이 더 커야 한다는 거다.
이를 식을 이항 정리를 하면 (v-a)/(a-b) <= count 가 나온다. 즉, (마지막날을 제외한 횟수는) (v-a)/(a-b) 보다 같거나 커야한다는 말이다.
그럼 여기서 마지막날까지 횟수를 포함시키기 위해선 (v-a)/(a-b) + 1 만 해주면 된다.
정리하면 (v-a)/(a-b) +1<= count +1 (count+1은 마지막날까지 포함한횟수) 이다.
이를 다시 result(==count+1)로 정리해보면 (v-a)/(a-b) +1<= result 로 정리할 수 있다. 결국 이 result 값(출력할 총 횟수)이 (v-a)/(a-b) +1 보다 크면 된다는 것이다.
하지만 여기서 한가지 더 생각해야 할 점이 있다. 만약에 (v-a)/(a-b) + 1 이 1.25 , 2.5 와 같이 소수점으로 나오면 어떻게 해야하는가? 그러면 정답이 result값(총 횟수)은 2번하고 0.5번만 수행하면 되는건가? 이것은 아니다. 횟수라는 건 자연수 이기 때문에 즉 1.25는 2번, 2.5는 3번 이기때문에 result값을 구하기 위해서는 (v-a)/(a-b) + 1 값에 올림함수를 써줘야한다.
따라서 답은 다음과 같다.
import math
a, b, v = map(int, input().split())
print(math.ceil((v-a)/(a-b)+1)) #올림함수 사용
'코팅테스트 > 백준 문제 모음' 카테고리의 다른 글
백준 2775번 파이썬 문제풀이(기본수학1 - 부녀회장이 될테야) (0) | 2021.09.10 |
---|---|
백준 10250번 파이썬 문제풀이(기본수학 - ACM호텔) (0) | 2021.09.10 |
백준 1193번 파이썬 문제풀이(기본수학 - 분수찾기) (0) | 2021.09.09 |
백준 2292번 파이썬 문제풀이(기본수학 - 벌집) (0) | 2021.09.09 |
백준 1712번 파이썬 문제풀이(기본수학 - 손익분기점) (0) | 2021.09.09 |