본문 바로가기

Baekjoon/C++

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

 

 

Baekjoon Online Judge

 

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

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

www.acmicpc.net

 

 

[문제]

땅 위에 달팽이가 있다. 이 달팽이는 높이가 V미터인 나무 막대를 올라갈 것이다.

달팽이는 낮에 A미터 올라갈 수 있다. 하지만, 밤에 잠을 자는 동안 B미터 미끄러진다. 또, 정상에 올라간 후에는 미끄러지지 않는다.

달팽이가 나무 막대를 모두 올라가려면, 며칠이 걸리는지 구하는 프로그램을 작성하시오.

 

 

[입력]

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

 

 

[출력]

첫째 줄에 달팽이가 나무 막대를 모두 올라가는데 며칠이 걸리는지 출력한다.

 

 


 

[풀이]

해당 문제는 시간 제한이 0.25초로, while문을 사용하면 시간 초과가 된다.

따라서 while문 없이 코드를 구현하는 것이 핵심이다.

 

달팽이는 낮에 A미터 올라가고 밤에 B미터 미끄러지므로

결과적으로 하루에 A - B만큼 올라간다고 볼 수 있다.

 

그러나 정상에 올라간 후에는 미끄러지지 않으므로

마지막 날에는 달팽이가 A - B가 아니라 A만큼 올라간다.

즉, 마지막 날을 제외하고 하루에 A - B만큼 올라가는 것이기에

이를 고려하여 높이를 V - B로 계산한다.

 

따라서 결과를 구하는 식은 (V - B) / (A - B)가 된다.

 

만약 (V - B) % (A - B)의 결과가 0이라면

(V - B) / (A - B)의 결과를 그대로 출력하면 되고,

0이 아니라면 달팽이가 하루를 더 올라가야 하므로

((V - B) / (A - B)) + 1을 출력하면 된다.

 

 

[코드]

#include <iostream>
using namespace std;

int main()
{
	int A, B, V;

	cin >> A >> B >> V;

	if ((V - B) % (A - B) == 0)
		cout << (V - B) / (A - B) << endl;
	else
		cout << ((V - B) / (A - B)) + 1 << endl;

	return 0;
}