본문 바로가기
Algorithm/C++

백준 - 2869 - 달팽이는 올라가고 싶다 - C++ /시간초과, 수식활용

by imagineer_jinny 2021. 3. 8.

2869번: 달팽이는 올라가고 싶다 (acmicpc.net)

 

2869번: 달팽이는 올라가고 싶다

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

www.acmicpc.net

문제

땅 위에 달팽이가 있다. 이 달팽이는 높이가 V미터인 나무 막대를 올라갈 것이다.

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

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

입력

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

출력

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

 

 

풀이

 

정상에 일단 다다르기만 하면 미끄러지지는 않으므로, 최종적으로 가야하는 목표는 V가 아닌 V-A까지만 가면 다음날 아침에 A만큼 올라서 정상에 다다를 수 있다.

 

그리고 V-A를 가는데에 걸리는 기간은 (V-A)/(A-B)이다.

이때 (V-A) / (A-B)가 나머지가 0일 경우에는 (V-A) / (A-B) 일 만큼 오르고, 마지막날 A만큼 오르면 되지만,
(V-A) / (A-B)의 나머지가 0이 아닐 경우에는 정상에 도달하기에 이동거리가 조금 모자라므로 1을 추가로 더해주면 된다.

 

반복문을 사용할 경우 무조건 시간초과가 발생하는 문제이다.

목표점이 V가 아닌 V-A라는 것을 캐치하는것이 관건이고, 그 후 (V-A) % (A-B)를 활용하여 1을 더해줄지 안더해줄지를 결정하는 것이 정답으로의 접근 방법이다.

#include <iostream>
using namespace std;
int main() {
    int a,b,v;
    cin >> a >> b >> v;
    int day = 1;
    day += (v-a)/(a-b);
    if((v-a)%(a-b) != 0)
        day++;
    if(a >= v)
        cout << "1";
    else
        cout << day;
    return 0;
}

 

오답코드1

오류 이유: 이렇게 풀었는데 마지막 예제3번에서 에러?가 떴다. 시간초과 때문 같은데 구글링을 해보니 

반복문을 통해 높이를 오르려고 할 경우, V의 범위가 최대 1,000,000,000이므로 시간초과가 발생한다고 한다.

따라서, 몇일이 걸리는지를 수학적으로 식으로 구현하여야 한다.

 

#include <iostream>
#include <algorithm>
#include <stdio.h>
using namespace std;


int main()
{
    int a, b, v;
   
    int cnt = 0;

    cin >> a >> b >> v;

    int climb=a;
   
    if (climb < v)
    {
        climb = climb - b;
        cnt++; //하루 지남
    }

    while (climb < v)
    {
        
        climb = climb + a;
        if (climb < v)
        {
            climb = climb - b;
            cnt++;
        }
        else {
            cnt++;
        }       

    };
    
    cout << cnt;
    
    return 0;
}

 

오답코드2

나름 수식을 사용해서 작성했는데 틀림

#include <iostream>
#include <algorithm>
#include <stdio.h>
using namespace std;


int main()
{
    int a, b, v;
   
    double cnt;

    cin >> a >> b >> v;

    cnt = (v + b) / a;
    cout << cnt+1;
  
 
    
    return 0;
}

댓글