백준/단계별

[C++] 백준 2869

loasd 2022. 12. 22. 00:07
반응형

백준의 2869번 달팽이는 올라가고싶다 문제이다.

 

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

 

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

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

www.acmicpc.net


 < 문제 >

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

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

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

 

 < 예제 >

 

문제를 정리하자면 이렇다.

달팽이가 낮에는 A만큼 올라가고 밤에는 B만큼 내려온다

V길이의 나무막대를 전부 올라가기 위해 걸리는 기간을 구하는 문제이다.

 

처음에는 이렇게 작성했었다.

#include <iostream>
#include <string>
using namespace std;

int main() {
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	int A = 0, B = 0, V = 0;	 // A = 낮에 올라가는 높이, B = 밤에 떨어지는 높이, V = 막대의 길이
	cin >> A >> B >> V;

	int day = 0, length = 0;
	while (true) {
		length += A;
		day++;
		if (length >= V)
			break;
		else
			length -= B;
	}
	cout << day;
}

간단히 while문을 활용해서 작성을 했는데 이렇게 하면 시간초과가 된다.

그래서 while문을 활용하지 않은 다른 풀이법으로 문제를 풀어야했다.

 

 

그렇게 푼 코드는 다음과 같다.

먼저 a, b, v를 입력받고

	int day = 0;
	if ((v - a) % (a - b) == 0)
		day = (v - a) / (a - b);
	else
		day = ((v - a) / (a - b)) + 1;

정상에 도달하면 그 후로는 B만큼 내려오지 않기 때문에 낮에 A만큼의 길이를 올라갔을 때 정상일 경우에는 그때를 날짜로 정하였다.

그 외는 낮에 다 올라갔는데 A보다 조금 모자라게 남았을 경우에는 다음날 올라갈 수 있기 때문에 1을 더해주었다.

 

전체 코드는 이렇다.

#include <iostream>
#include <string>
using namespace std;

int main() {

	int a, b, v;
	cin >> a >> b >> v;

	int day = 0;
	if ((v - a) % (a - b) == 0)
		day = (v - a) / (a - b);
	else
		day = ((v - a) / (a - b)) + 1;

	cout << day + 1;
}

 

시간초과를 처음 겪어봐서 좀 귀찮긴 했지만 정상에 도달했을 때는 미끄러지지 않는다는 점을 놓치지 않고 

원하는 식을 얻는다면 엄청 어려운 문제는 아니라고 생각한다.

반응형

'백준 > 단계별' 카테고리의 다른 글

[C++] 백준 2775  (0) 2022.12.22
[C++] 백준 10250  (0) 2022.12.22
[C++] 백준 1193  (0) 2022.12.22
[C++] 백준 2292  (1) 2022.12.20
[C++] 백준 1712  (0) 2022.12.19