촉촉한초코칩
[백준] 2869(달팽이는 올라가고 싶다) c언어 본문
문제
땅 위에 달팽이가 있다. 이 달팽이는 높이가 V미터인 나무 막대를 올라갈 것이다.
달팽이는 낮에 A미터 올라갈 수 있다. 하지만, 밤에 잠을 자는 동안 B미터 미끄러진다. 또, 정상에 올라간 후에는 미끄러지지 않는다.
달팽이가 나무 막대를 모두 올라가려면, 며칠이 걸리는지 구하는 프로그램을 작성하시오.
입력
첫째 줄에 세 정수 A, B, V가 공백으로 구분되어서 주어진다. (1 ≤ B < A ≤ V ≤ 1,000,000,000)
출력
첫째 줄에 달팽이가 나무 막대를 모두 올라가는데 며칠이 걸리는지 출력한다.
처음에는 while문으로 작성했는데, 숫자가 커지면 25초 안에 문제를 해결할 수 없었다.
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int a, b, v; //낮(+), 밤(-), 높이
int sum = 0, day = 1;
scanf("%d %d %d", &a, &b, &v);
while(1) {
sum+=a;
if(sum >= v) {
printf("%d\n", day);
break;
} else {
sum-=b;
day+=1;
}
}
return 0;
}
게시판 댓글에서, 반복문을 사용하지 않아야 한다는 말을 듣고 이 안에 공식을 찾으려고 했으나... 잘 되지 않았다...
printf("%d\n", v-a+1);
printf("%d\n", v-(b-a));
sum = v/a;
printf("%d\n", sum-(a+b));
first = a - b;
printf("%d\n", v/first - 1);
만약, a의 속도로만 올라간다면 (v / a)일 만에 올라갈 수 있는데,
b만큼 매일 내려오니, (v / a) * b를 해야하지 않나..? 라고 생각했다...
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int a, b, v; //낮(+), 밤(-), 높이
int sum = 0, tmp = 0;
int tmp2; //a-b (매일 낮아지는 높이)
scanf("%d %d %d", &a, &b, &v);
tmp = v % a;
tmp2 = a - b;
if(tmp == 0) {
tmp = v / a;
sum = tmp * tmp2;
printf("1. %d\n", sum - tmp);
} else {
tmp = v / a + 1;
sum = tmp * tmp2;
printf("2. %d\n", sum - tmp);
}
return 0;
}
계속 이런식으로 코드를 짜다 보니... 굳이 a의 속도로 올라갔다면 이라는 가정을 할 필요가 있나..? 싶어졌다.
근데 결국엔 어떻게 해결해야 할지 몰라서... 검색함.ㅎ https://www.acmicpc.net/board/view/112251
#include <stdio.h>
int main() {
int a, b, v, day = 0;
scanf("%d %d %d", &a, &b, &v);
day = (v - b - 1) / (a - b) + 1;
printf("%d", day);
return 0;
}
근데 아직 왜 b를 빼고 1을 또 빼는지... 잘 모르겠다
https://yahohococo.tistory.com/28
단번에 이해됐다...ㅠ
'Algorithm' 카테고리의 다른 글
[백준] 27433(팩토리얼 2) c언어 (0) | 2024.02.16 |
---|---|
[백준] 15439(베라의 패션) c언어 (0) | 2024.02.06 |
[백준] 1316(그룹 단어 체커) c언어 (0) | 2024.01.27 |
[백준] 1924(2007년) c언어 (0) | 2024.01.27 |
[백준] 10815(숫자 카드) c언어 (0) | 2023.12.22 |