Moong

[백준 2869번][C++] 백준 달팽이는 올라가고 싶다 본문

Baekjoon

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

방울토망토 2021. 1. 7. 03:26

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가 공백으로 구분되어서 주어진다. (1 ≤ B < A ≤ V ≤ 1,000,000,000)

출력

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


풀이

Algorithm

  1. 우선 날짜를 어떻게 세어주어야 할지 생각해봅니다.
    • 막대를 모두 올라가게 되는 시점은 마지막 날 낮이겠죠? 다시 내려올 필요가 없으니까요!
    • 이걸 알아냈으면, 이제 나머지 날에는 하루에 (A-B)만큼 올라감을 알 수 있습니다.
    • 그렇다면 마지막 날 전까지는 적어도 (V-A) 만큼을 올라가야겠죠?! (마지막 날 A만큼은 무조건 올라갈거니까요)
    • 그래서 V-=A를 해주고, count에도 마지막 날 낮에 올라가는 그 하루를 미리 세어 줍니다. (count=1;)
  2. 마지막 날 전까지 올라가는 데 며칠 걸리는지 구하기
    • 하루에 (A-B)만큼 올라갈 수 있으니, n일 후에는 (A-B)*n만큼 올라갈 수 있습니다.
    • 이때, V <= (A-B)*n이 되는 n을 구하면 되겠죠?
    • n = V/(A-B)가 됨을 알 수 있습니다. 그런데, 여기에서 n은 정수이기 때문에 나머지가 발생하는 경우 몫에서 1을 더해주어야 합니다.
    • 그래서 간략한 if문을 써주었어요. 나머지가 없는 경우에는 count에 V/(A-B)를 더해주고, 나머지가 있으면 count에 V/(A-B)+1을 더해줍니다.
  3. count를 출력하면 끝!

 

code

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

int main() {
	int V, A, B, count = 1; // 마지막 날 낮에 올라가는거 미리 세어주기
	cin >> A >> B >> V;
	V -= A; // 마지막 날 낮에 올라가는거 빼주기!
	// 나머지가 있는 경우엔 몫에서 +1을 해주기!
	count += (V % (A - B) == 0 ? V / (A - B) : V / (A - B) + 1);
	cout << count << '\n';

	return 0;
}
Comments