달팽이는 올라가고 싶다
https://www.acmicpc.net/problem/2869
여러번의 계산을 통해 구할 수 있다.
A만큼 올라감 -> V에 도달했는지 확인 -> 못미쳤으면 B만큼 내려갔다가 다시 A만큼 올라감 -> V만큼 올라갔는지 확인
을 반복하면 가능하지만 이 문제의 경우, V의 값이 매우 큰 수(1,000,000,000)가 가능하고, 0.15초의 시간제한이 있다.
어떻게 하면 더 빨리 계산이 가능한지 고민했다.
내가 작성한 코드
1
2
3
4
5
6
|
A, B, V = map(int, input().split())
n = (V - A) / (A - B)
if n == int(n):
print(int(n) + 1)
else:
print(int(n) + 2)
|
cs |
정상에 도착하고 나면 미끄러지지 않기 때문에 맨 마지막에 A만큼 올라간 날이 마지막으로 올라간 날이다.
그래서 (V-A)만큼 몇일에 걸쳐서 올라가는지 (A-B)를 나눠 n번째 날을 구해준다.
n이 정수로 딱 나눠떨어지면 +1일만 하면 정상까지 올라가고,
n에 소수점이 생긴다면 하루가 더 필요하다는 이야기이다.
하루 더 올라갔다 내려오면 (V-A) + (A-B) = V - B만큼 올라간 상태가 된다. 조건에서 B <= A 이므로 하루만 더 올라가면 정상에 도달할 수 있다.
n이 정수인지 소수인지에 따라 +1 혹은 +2 를 한 값을 화면에 출력하면 된다.
여러번 계산하는 대신 한 번만 계산하는 것으로 날짜를 구할 수 있다.
'알고리즘' 카테고리의 다른 글
백준 - 2775번 / 함수의 호출 횟수(counter) (0) | 2021.08.03 |
---|---|
백준 - 10250번 (0) | 2021.08.03 |
백준 - 1316번 (0) | 2021.08.03 |
백준 - 2941번 / replace() (0) | 2021.08.02 |
백준 - 5622번 / find(), index(), list comprehension (0) | 2021.08.02 |