공부/백준(C++) - 2022~

백준 2869번: 달팽이는 올라가고 싶다 [C++]

상연 2022. 1. 13. 22:06

목차

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

     

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

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

    www.acmicpc.net

    코드

    #include <iostream>
    using namespace std;
    
    int main() {
    	int A, B, V;
    	int answer;
    	cin >> A >> B >> V;
    	
    	//하루만에 올라갈 수 있을 때
    	if(V <= A) answer = 1;
    	else{
    		V -= A;
    		if(V % (A - B)) answer = V / (A - B) + 2;
    		else answer = V / (A - B) + 1;
    	}
    	cout << answer;
    	
    }

     

    설명

    세 가지 Case로 나누어서 생각하면 풀 수 있는 문제이다.

    i ) V <= A

    밤까지 가지 않아도 되는 경우, 하루 낮으로 올라갈 수 있는 경우이다.

    i case의 경우가 아니라면?

    우선, 정상에 도착하면 밤에 미끄러지지 않으므로 마지막 날 낮의 이동으로 정상에 무조건 간다.

    그렇기 때문에 길이 V에서 낮의 이동거리 A를 먼저 빼준다.

    ii) (V - A) % ( A - B) 가 0이 아닌경우.

    나머지가 있다는 것은, 낮-밤의 이동일이 (V - A) / (A - B) + 1이 되어야 한다는 뜻이다.

    ii) (V - A) % ( A - B) 가 0인 경우.

    나머지가 없다는 것은 딱 맞아 떨어지므로 

    낮-밤 이동을 (V - A) / (A - B) 만큼 하고 다음날 아침에 A만큼 이동하면 정상에 딱 올라간다는 뜻이므로

    낮-밤의 이동일이 (V-A) / (A-B) 라는 뜻이다.

     

    이렇게 3 가지 경우가 있다는 것을 생각해서 풀이하면 되는 문제이다.

    반복문을 사용하여 풀이하는 경우 시간 초과가 잘 가능성이 크므로, 이러한 방법으로 풀이하면 될 것 같다.