본문 바로가기
백준 알고리즘 단계별 풀이 (문제 수)/기본 수학 1 (8)

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

by 17번 일개미 2022. 7. 4.
728x90

문제

 

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

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

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

 


문제 해석

 

높이가 V 인 나무가 있고 낮에 A만큼 올라가고, 밤에 B만큼 내려간다. 단, 낮에 V에 도달하면 날짜를 세지 않고 종료한다.

예를 들어 높이가 5인 나무를 낮에 2, 밤에 1 이라고 할 때, 

1일차 위치 : 1

2일차 위치 : 2

3일차 위치 : 3

4일차 낮의 위치 : 5

 


풀이

밤에는 거리가 감소하므로, 밤에는 목적지에 도착할 수가 없다.

낮에만 도착이 가능한데, 나무 V 를 하루 이동거리(A - B)로 나누어 버리게 되면, 마지막 날 도착을 했어도 B 만큼 빠져버리는 상황이 발생한다.

따라서, 도착하는 마지막 날 낮의 위치는 처음부터 없었다고 생각을 하고 나중에 날짜를 1번 더해주는 것으로 접근한다.

 

그럼 나무의 길이 V 는 V - A(낮 이동거리) 로 줄어든다.

 

하루에 이동하는 거리는 A - B (낮 이동거리 - 밤 이동거리) 이다.

 

만약에, 현재 나무의 길이(V - A) 를 하루 이동 거리(A - B) 로 나누었을 때,

정확히 나누어 떨어진다면, 몫은 걸린 날짜가 된다.

 

A = 2, B = 1, V = 5 라고 가정하자.

 

이 때의 걸린 날짜는 정확히 나누어 떨어지므로, 몫 3 이 정답이 된다.

처음에 낮에 1번을 이미 이동한 것 처럼 빼주었으므로, 3 + 1 하여 총 4일이 걸리게 된다.

 

만약에, 현재 나무의 길이(V - A) 를 하루 이동 거리(A - B) 로 나누었을 때,

위처럼 나누어 떨어지지 않을 경우도 생각해야한다.

 

 

A = 5, B = 1, V = 6 이라고 가정하자.

 

몫은 0 이 나오게 되고 나누어 떨어지지 않는다.

이 말은, 몫 만큼 날짜가 걸리고도 아직 거리가 앞으로 무조건 1번 이동할 만큼 남았다는 뜻이 된다.

 

따라서, 몫  + 1(남은 거리만큼 하루) + 1(처음 뺀 이동거리) 만큼 날짜가 걸리게 된다.

정리하면, 몫 + 2가 정답이 된다.


구현

#include <iostream>
using namespace std;

int main()
{
	int day; int night; int tree; // 낮, 밤, 나무

	cin >> day >> night >> tree;

	if ((tree - day) % (day - night) == 0) // 나누어 떨어진다면
	{
		cout << (tree - day) / (day - night) + 1;
	}
	else cout << (tree - day) / (day - night) + 2; // 나머지가 생기면
}
728x90