1 minute read

❓문제

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

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

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

✏️입력

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

📜출력

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

💻코드

/*
	 [백준 2869] 달팽이는 올라가고싶다
	  22-08-03 / c++

	  < 문제 >

	  땅 위에 달팽이가 있다. 이 달팽이는 높이가 V미터인 나무 막대를 올라갈 것이다.
	  달팽이는 낮에 A미터 올라갈 수 있다. 하지만, 밤에 잠을 자는 동안 B미터 미끄러진다.
	  또, 정상에 올라간 후에는 미끄러지지 않는다.
	  달팽이가 나무 막대를 모두 올라가려면, 며칠이 걸리는지 구하는 프로그램을 작성하시오.
	   
	  < 알고리즘 >
	  
	  숫자 입력받고, V, D, N
	  낮에 올라가는 거리 D * 낮시간, 밤에 미끄러지는 거리 N*밤시간
	  낮에 이동한 거리를 총 이동거리에 더한 뒤, 총 이동거리가 V이상이 되면 멈춤
	  그렇지 않으면 밤에 미끄러진 거리를 빼주어야한다. 
	  반복문을 돌리는데 이때 i가 걸린 일 수.

 */

#include<iostream>

using namespace std;

int main(void) {
	int V;
	int D, N;
	int total = 0;
	int day;

	cin >> D >> N >> V;

	for (int i = 1; total < V; i++) {
		total += D;
		if (total >= V) {
			day = i;
			break;
		}
		total -= N;
	}

	cout << day;
	return 0;

}
  • 결과는 제대로 나오지만 시간초과로 실패했다.
/*
	 [백준 2869] 달팽이는 올라가고싶다
	  22-08-03 / c++

	  < 알고리즘 >
	  
	  숫자 입력받고, v, d, n.
	  하루에 움직이는 거리 d-n, 
	  첫째날 낮은 무조건 이동이 진행되므로 v-d를 해준다. 
	  "미끄러지는 저녁~다음날 낮"으로 생각하여 v-d를 하루에 움직이는 거리로 나눠준다.
	  나머지가 0이면 딱 맞게 올라간 것이므로 첫째날만 더해준다. (+1)
	  나머지가 0이 아니면 그 다음날 낮에 정상에 오르는 것이므로 첫째날과 합해 이틀을 더해준다(+2)
 */

#include<iostream>

using namespace std;

int main(void) {
	int V, D, N;
	int day;

	cin >> D >> N >> V;
	V -= D;

	int distanceOfDay = D - N;			//하루 이동 거리
	if (V % distanceOfDay != 0)
	{
		day = V / distanceOfDay + 2;
	}
	else {
		day = V / distanceOfDay + 1;
	}

	cout << day;
	return 0;
}