[BOJ] 2869_달팽이는 올라가고 싶다

gogori6565·2022년 8월 2일
0

문제 출처 : https://www.acmicpc.net/problem/2869

문제
달팽이는 높이가 V미터인 나무 막대를 올라갈 것이다.

달팽이는 낮에 A미터 올라갈 수 있다. 하지만, 밤에 잠을 자는 동안 B미터 미끄러진다. 또, 정상에 올라간 후에는 미끄러지지 않는다.

달팽이가 나무 막대를 모두 올라가려면, 며칠이 걸리는지 구하는 프로그램을 작성하시오.

시간 제한 : 0.15초
입력 : (1 ≤ B < A ≤ V ≤ 1,000,000,000)


풀이
시간 제한이 0.15초이고, 입력이 크기 때문에 단순 반복문으로 풀면 시간초과가 뜰 것 같아 다른 방법으로 풀었다.

달팽이가 하루에 올라가는 높이는 (A-B) 이다.
단, 정상에 올라간 후에는 미끄러지지 않으므로 달팽이는 (V-A) 만큼에 +1일 더 올라가는 것과 같다.
(마지막 날은 -B 높이를 하지않은 A높이 그대로 올라가니까)

따라서, 달팽이는 (V-A)/(A-B)+1 만큼 막대를 올라간다.
이때 (V-A)/(A-B) 가 2.xxx 같은 소수점있는 실수일 경우 달팽이는 3번 올라간 것과 같으므로 천장함수를 사용해 값을 올려준다.

  • ceil() : 천장함수 / floor() : 바닥함수
  • 헤더 : (C)<math.h> / <(C++)cmath>

풀이 코드

#include<iostream>
#include<cmath>
using namespace std;

int main(void)
{
    cin.tie(NULL); ios_base::sync_with_stdio(false);

    int a,b,v;
    cin>>a>>b>>v;

    cout<<int(ceil((double)(v-a)/(double)(a-b)))+1;
}

a,b,v 변수를 애초에 실수형으로 받아서 형변환을 하지 않고 작성해도 된다.


잡담
예제 입력 3인
입력 : 100 99 1000000000
출력 : 999999901
를 보면서 힌트를 크게 얻은 듯?!
출력이 V에서 A빼고 달팽이가 하루 올라가는 높이 (A-B)를 더한 값과 같다..?
요기서 느낌이 뽝 왔다.

profile
p(´∇`)q

0개의 댓글