# 백준 : 달팽이는 올라가고 싶다(2869)

문제

https://www.acmicpc.net/problem/2869

소스

(Github: https://github.com/wonjnlee/wallydev/blob/master/bj_2869_snailwantstogoup)

#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <cstring>
#include <list>
using namespace std;

int main(void)
{
    long long int a, b, v, result, cal;
    cin>>a>>b>>v;
    cal = (v - b) % (a - b);
    result = (v - b) / (a - b);
    if(cal) result += 1;
    cout<<result<<endl;
    return 0;
}

풀이

이진트리용 문제라고 적어놓았는데, 사실 식만 제대로 세우면 굳이 이진트리로 안풀어도 된다.
앞으로 가는 거리를 A, 뒤로 돌아가는 거리를 B, 총 움직여야 하는 거리를 V라고 하면.
결국 최종 이동해야 하는 거리는 (V - B) / (A - B) 여야 한다.
문제는, 정확하게 떨어지지 않는 경우가 발생한다는 것이다.
예를 들어 **가 앞으로 이동한 거리, *가 뒤로 움직여서 실제로 이동한 거리라고 할 때,

1. A가 3, B가 1, V가 5면 
[*][*][**][ ][ ] -> [*][*][*][*][**] 이므로 2번만에 이동이 가능하다. 

하지만
2. A가 4, B가 1, V가 5면
[*][*][*][**][ ] -> [*][*][*][*][*]... 로 실제로는 나누어지지 않고 넘치게(덜 가게) 된다.

그러므로 두 경우에 대한 계산으로 미리 지금 상황이 어떤지만 확인해줘서
정확하게 떨어지지 않는 경우 +1만 해주면 된다.

댓글