algorithm(c++)

달팽이는 올라가고 싶다

2426 2023. 4. 24. 14:56

 

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

 

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

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

www.acmicpc.net

 

a:하루중 낮에 올라가야할 거리

b:하루중 밤에 내려와야할 거리

v:총 올라가야 할 거리(v와 같은 숫자만큼 이동 했을때 종료해야할 거리)

 

왜 이렇게 코드를 짜야하는가?

코드를 마지막하루와 마지막이 되기 전날들에 대해 고려한다.

 

(v - a)에 대해 이야기 해보자.

v만큼 올라가야 하는데 마지막날에는 v보다 현재 위치가 초과하여 이동할 수도 있고, 정확히 v까지 이동할 수도 있다.

따라서 마지막 하루를 미리 빼서 (v - a)만큼을 올라간다고 생각해야한다.

그렇기 때문에 day는 1부터 시작한다.

 

다음은 마지막이 되기 전날들에 대해 이야기 해보자.

마지막날에 a만큼 올라갔으니

(v - a) 만큼을 하루가 지났을때 이동하는 거리(a - b)를 나눈다면 며칠을 가야하는지 알 수 있게 될 것이다.

그렇다면 (v - a)가 10이고 (a - b)가 3이라면?

3일을 가야하고 나머지 1일때 또 하루를 더 가야한다.

그렇다면 (v - a)가 10이고 (a - b)가 2라면?

5일을 가야하고 정확히 마지막날(6일) 낮에 나무막대 꼭대기에 도착하게 될 것이다.

 

이 과정에서 나누기 연산(/)을 하여 몫만큼 day를 증가시키고

나머지 연산(%)할 때 나머지가 존재하게 되면 하루를 더 가야한다.

 

#include <iostream>

int main(){
    int a, b, v;                    // a:하루중 낮에 올라가는 거리   b:하루중 밤에 내려오는 거리    v:총 올라가야할 거리
    std::cin >> a >> b >> v;        // 입력
    int day = 1;
    day += (v - a) / (a - b);
    if((v - a) % (a - b) != 0) day++;
    std::cout << day;
}