- 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;
}
포인트
- 실수와 정수 판별 → 정수 = 실수 한다면 실수형 변수값이 버림으로 정수형 변수값에 들어간다. 이후 정수 == 실수 가 참이라면 정수, 아니면 실수로 판별할 수 있다.
- 조건을 확인한 것이 다른 방향으로 생각할 수 있는 근거를 제시했다.