• toc {:toc}

문제

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

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

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

입력

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

출력

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

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

풀이

수식을 우선적으로 떠올렸다.

V ≤ nA-(n-1)B (단, n은 day) 로 생각했다. 이 이유는 A는 더해지고 B는 줄여지는 반면 정상에 도달한 후 부터는 미끄러지지 않기 때문에 A가 B보다 한 번 더 더해지고 난 후 정상에 도달할 것이라 생각했기 때문이다.

이후 식을 정리하니 n ≥ (V-B)/(A-B) 로 정리됐고 이를 구현하고자 했다. 처음에는 n을 단순히 반복문을 통해 하나씩 n++하려 했으나 이럴 필요가 없는 것을 깨달았다.

식 자체를 사용하여 값을 알아내고, 값이 실수라면 +1, 정수라면 그 값을 그대로 day로 출력하면 됐다.

#include <iostream>
 
using namespace std;
 
int main()
{
	double a, b, v, n, de; int day;
	cin >> a >> b >> v;
	
	day = (v-b)/(a-b);
 
	if(day != (v-b)/(a-b))
		day++;
		
	
	cout << day << endl;
	
	return 0;
}

포인트

  1. 실수와 정수 판별 → 정수 = 실수 한다면 실수형 변수값이 버림으로 정수형 변수값에 들어간다. 이후 정수 == 실수 가 참이라면 정수, 아니면 실수로 판별할 수 있다.
  2. 조건을 확인한 것이 다른 방향으로 생각할 수 있는 근거를 제시했다.