[백준 | 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개의 댓글

관련 채용 정보