촉촉한초코칩

[백준] 2869(달팽이는 올라가고 싶다) c언어 본문

Algorithm

[백준] 2869(달팽이는 올라가고 싶다) c언어

햄친구베이컨 2024. 2. 2. 03:24

문제

땅 위에 달팽이가 있다. 이 달팽이는 높이가 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

 

단번에 이해됐다...ㅠ