본문 바로가기
알고리즘/백준

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

by fortissimo 2024. 8. 9.

문제


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

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

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

 

입력


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

 

출력


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

 

문제 풀이


수학 문제.

 

정상에 올라갈 때까지 반복문을 이용하면 시간 초과가 발생한다.

달팽이가 정상에 올라갈 때까지 밤에 미끄러지다 마지막 하루는 낮에 모두 올라갈 수 있다. 다시 말해 나무 막대를 올라가는데 걸리는 날짜는 미끄러진 날짜의 일수 + 1일이다.

미끄러진 날(마지막 하루 제외한 나머지 날짜)에 이동할 수 있는 거리 * 미끄러진 날짜의 일 수 + 미끄러지지 않은 날(마지막 하루)에 올라가는 거리가 V가 넘어야 한다.

미끄러진 날에는 결국 A - B만큼 이동하고, 마지막 하루는 (최대) A만큼 이동한다. 따라서 (A - B)* 미끄러진 날짜의 일 수 + A >= V여야 하고, 왼쪽에 미끄러진 날짜의 일 수만 남기면 미끄러진 날짜의 일 수 >=V / (A - B)이다. 그러므로 V / (A-B)의 값에 ceil을 걸어주면 미끄러진 날짜의 일 수가 나온다. 여기에 1을 더하면 정답이다.

 

아래는 코드.

더보기
#include <iostream>
#include <cmath>
using namespace std;

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

	int A, B, V;
	cin >> A >> B >> V;
	int day = A - B;
	double slipDayDouble = (double)(V - A) / (double)day;
	int slipDayInt = ceil(slipDayDouble);
	cout << slipDayInt + 1 << "\n";
	return 0;
}

'알고리즘 > 백준' 카테고리의 다른 글

[백준 30804] 과일 탕후루 (C++)  (0) 2024.08.11
[백준 13909] 창문 닫기 (C++)  (0) 2024.08.10
[백준 1436] 영화감독 숌 (C++)  (0) 2024.08.08
[백준 15829] Hashing (C++)  (0) 2024.08.07
[백준 4949] 균형잡힌 세상 (C++)  (0) 2024.08.06