땅 위에 달팽이가 있다. 이 달팽이는 높이가 V미터인 나무 막대를 올라갈 것이다.
달팽이는 낮에 A미터 올라갈 수 있다. 하지만, 밤에 잠을 자는 동안 B미터 미끄러진다. 또, 정상에 올라간 후에는 미끄러지지 않는다.
달팽이가 나무 막대를 모두 올라가려면, 며칠이 걸리는지 구하는 프로그램을 작성하시오.
#include <stdio.h>
int main() {
int v,a,b;
int day = 1;
int m = 0;
scanf("%d %d %d",&a,&b,&v);
while(1){
m += a; // 낮에 올라가는 값
if (m >= v){
break;
}
m -= b; // 밤에 미끄러지는 값
day++;
}
printf("%d",day);
return 0;
}
처음에는 이렇게 풀었다. VS에서는 잘만 돌아가는데 백준에서는 자꾸 시간초과라고 한다.
역시 이렇게 쉬운 문제면 브론즈 1단계로 내겠나 싶다... 그래서 수정했다.
#include <stdio.h>
int main() {
int v,a,b;
scanf("%d %d %d",&a,&b,&v);
int day = (v-a) / (a-b) + 1;
if ((v-a) % (a-b) == 0){
printf("%d",day); // n일 올라가고 남는 길이 없이 딱 떨어지는 경우.
}
else {
printf("%d",day+1); // n일 올라가고 남는 길이를 낮에 다 못 올라가는 경우.
}
return 0;
}
조금 설명해보자면
밤에는 미끄러지지만 낮에는 올라간다. 만약에 5미터 올라갈건데 4미터 올라가고 1미터씩 미끄러진다고 하면 하루에 3미터라고 생각하면 된다 그러면 2미터가 남고 남은 2미터는 하루밤 잘 필요없이 낮에 다 올라간다. 즉 올라가려는 길이(5)에다가 낮에 올라갈 수 있는 길이(4)를 빼고 올라가는 길이(4)와 미끄러지는 길이(1)의 차를 나눠주고 거기에 하루를 더해주면 된다.
(5-4) / (4-1) == 1 / 3 ==> 0(day) + 1(day)
적다보니 설명이 너무 복잡하고 길어진 거 같다...