[백준 | Javascript] 2869

박기영·2022년 6월 27일
0

백준

목록 보기
57/127

기본 수학1 4단계
2869번. 달팽이는 올라가고 싶다

문제

땅 위에 달팽이가 있다. 이 달팽이는 높이가 V미터인 나무 막대를 올라갈 것이다.
달팽이는 낮에 A미터 올라갈 수 있다. 하지만, 밤에 잠을 자는 동안 B미터 미끄러진다. 또, 정상에 올라간 후에는 미끄러지지 않는다.
달팽이가 나무 막대를 모두 올라가려면, 며칠이 걸리는지 구하는 프로그램을 작성하시오.

입력

첫째 줄에 세 정수 A, B, V가 공백으로 구분되어서 주어진다. (1 ≤ B < A ≤ V ≤ 1,000,000,000)

출력

첫째 줄에 달팽이가 나무 막대를 모두 올라가는데 며칠이 걸리는지 출력한다.

예제 입출력

예제 입력 1

2 1 5

예제 출력 1

4

예제 입력 2

5 1 6

예제 출력 2

2

예제 입력 3

100 99 1000000000

예제 출력 3

999999901

solution

const fs = require("fs");
const input = fs.readFileSync("/dev/stdin").toString().split(" ");

const up = input[0];
const slide = input[1];
const height = input[2];

// height를 (up - slide)로 나누면 되지않나 생각할 수도 있다.
// 이 방법의 문제는 하루에 무조건 up과 slide가 모두 발생함을 가정한다는 것이다.
// 따라서 up 후 정상에 도달하면 slide가 발생하지 않는다는 것을 고려해야한다.
// 그 때의 식을 표현하면 아래와 같다.
// height - slide = (up - slide) * count
// 이게 가능한 것은 slide가 up보다 작기 때문이다. 만약 컸다면 계속 내려가기만 할테니..
const count = (height - slide) / (up - slide);

console.log(Math.ceil(count));

시간 초과

const fs = require("fs");
const input = fs.readFileSync("/dev/stdin").toString().split(" ");

const up = input[0];
const slide = input[1];
let height = input[2];

let count = 0;

while(true){
  // height에서 올라간 거리만큼 뺄셈
  height -= up;
    
  // 올라간 횟수 증가
  count++;
    
  // height에서 up을 뺀 결과가 0 이하라면 정상에 도달했으므로 break
  if(height <= 0){
    break;
  }
    
  // height가 음수가 아니라면 이 문장을 실행하게 됨
  // 즉, 정상에 도달한게 아니므로 밤에 미끄러져 내려옴
  height += slide;
}

console.log(count);

해설

처음 작성했던 코드는 동작에는 문제가 없었지만 문제에서 요구되는 시간을 초과해서 통과하지 못했다.(시간 초과 제목에 있는 코드)
최대한 반복문을 줄이면서 논리를 유지하도록 수정했다.

profile
나를 믿는 사람들을, 실망시키지 않도록

0개의 댓글