https://www.acmicpc.net/problem/2869
Idea
제목은 귀여웠지만 문제는 전혀 귀엽지 않은 문제..?
시간 제한에서 (추가 시간 없음) 보고 뒤로가기 누를려다 참음ㅋㅋ
알고리즘 수행시간 줄이는 건 잘 못해서 항상 이런 문제는 피하다가 처음으로 도전해봤는데 어느정도 요령이 생긴 듯 하다.
우선 시간복잡도를 신경쓰지 말고 답만 맞는 코드를 하나 만들었다.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h>
int main(void) {
int a, b, v, i = 2;
// a morning b night v height
scanf("%d %d %d", &a, &b, &v);
int num1 = a, num2 = b;
while (1) {
num1 += a;
if ((num1 - num2) >= v) {
printf("%d", i);
break;
}
num2 += b;
i++;
}
return 0;
}
답으로 제출할 건 아니지만 이렇게 만들어 놓으면 이 문제처럼 연산 한 줄로 끝내야하는 문제에서 예제가 많아지기 때문에 여러가지 식을 세울 때 도움이 된다.
네 그냥 제 방식이고요
하루에 달팽이가 올라가는 거리는 A - B가 된다.
총 올라가야 하는 나무의 높이는 V이지만 달팽이는 나무를 다 올라가면 미끄러지지 않기 때문에 V - B가 된다.
즉, (V - B) / (A - B) 라는 연산식을 얻을 수 있다.
ㅇ?..
다시 보면 (V - B) 를 (A - B) 로 나누는데 나누어 떨어지지 않는 경우가 생긴다. 나누어 떨어지는지 아닌지 판별하는 조건문을 만들고 연산을 다시 할까 했지만 역시 더 쉬운 방법이 있었다.
그냥 (V - B) 에 1 만큼 빼주고 전체에 1 만큼 더해주면 된다.
(V - B - 1) / (A - B) + 1
Code
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void) {
int a, b, v;
scanf("%d %d %d", &a, &b, &v);
printf("%d", (v - b - 1) / (a - b) + 1);
return 0;
}
ㅎㅎ