본문 바로가기

algorithm/백준알고리즘

[백준알고리즘] 2869번: 달팽이는 올라가고 싶다 -Python, C++

728x90

[백준알고리즘] 2869번: 달팽이는 올라가고 싶다 -Python, C++

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

 

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

문제 땅 위에 달팽이가 있다. 이 달팽이는 높이가 V미터인 나무 막대를 올라갈 것이다. 달팽이는 낮에 A미터 올라갈 수 있다. 하지만, 밤에 잠을 자는 동안 B미터 미끄러진다. 또, 정상에 올라간 후에는 미끄러지지 않는다. 달팽이가 나무 막대를 모두 올라가려면, 며칠이 걸리는지 구하는 프로그램을 작성하시오. 입력 첫째 줄에 세 정수 A, B, V가 공백으로 구분되어서 주어진다. (1 ≤ B < A ≤ V ≤ 1,000,000,000) 출력 첫째 줄에 달팽

www.acmicpc.net

달팽이가 하루에 a만큼 올라갈 수 있다. 그러나 밤 사이에 b만큼 내려오기 때문에 낮동안 v까지 올라가지 못한다면 b만큼 내려와야 하는 것이다.

 

그래서 마지막 날에는 낮동안 a만큼 올라간다고 생각을 했고, 기본적으로 하루는 지나고 시작을 했다.

 

하루 전체에서 올라갈 수 있는 높이 a-b로 v-a를 나눴을 때 나누어 떨어진다면, 나눈 몫만큼의 일 수에 마지막 날 a만큼의 높이를 올라가면 v까지 올라갈 수 있다는 것을 의미한다.

 

하지만 a-b로 v-a를 나눴을 때 나눠 떨어지지 않는다면, 그거보다 하루는 더 지나야 v보다 높은 지점을 도달할 수 있는 것이다.

 

따라서 기본적으로 v//(a-b) + 1에 나눠 떨어지지 않는다면 1을 더 더해주도록 했다.

a, b, v = map(int, input().split())
v -= a
print(v//(a-b) + 1 if v%(a-b) == 0 else v//(a-b) + 2)

 

아래는 C++ 코드이다. 로직 자체는 같다.

#include <iostream>

int main(void)
{
	int a, b, v;
	std::cin >> a >> b >> v;
	
	int days = 1;
	v = (v < a ? 0 : v - a);
	days += int(v / (a - b)) + (v % (a - b) ? 1 : 0);

	std::cout << days;
}

 

잘못된 점이나 부족한 점 지적해주시면 감사하겠습니다

728x90