공부/백준(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 가지 경우가 있다는 것을 생각해서 풀이하면 되는 문제이다.

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