알고리즘

백준 - 2869번

joy_lee 2021. 8. 3. 15:02

달팽이는 올라가고 싶다

https://www.acmicpc.net/problem/2869

 

2869번: 달팽이는 올라가고 싶다

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

www.acmicpc.net

여러번의 계산을 통해 구할 수 있다.

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())
= (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