💻 개인공부 💻/알고리즘

[백준 - 2869] 달팽이는 올라가고 싶다.

공대생 배기웅 2020. 9. 3. 21:27
반응형

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

 

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)

출력

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

예제 입력 1 복사

2 1 5

예제 출력 1 복사

4

 

 

사고의 흐름

 

1. 아무 조건 없이 위의 문제를 풀면 어렵지 않지만 시간이 0.15초라는 점이 이 문제의 특징이다. 처음에는 while문을 이용하여 문제를 풀었지만 시간초과가 발생하여 문제를 풀 수 없었다. 다른 방법을 사용해야 한다. 

 

 

2. 몇 일이 걸리는지를 수학적으로 구현을 해야 한다고 한다. 매일 A-B만큼 올라가기 때문에 V-A만큼 올라가는데 걸리는 기간은 (V-A)/(A-B)이다. 이때 (V-A)/(A-B)가 0으로 딱 나누어 떨어지면 상관이 없지만 나머지가 존재하면 나머지만큼 그 다음날 올라가야 한다. 따라서 이런 경우에는 1을 더한다. 이 부분을 else문을 통해 표현한다. 

 

 

 

소스코드 및 실행결과

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include<iostream>
using namespace std;
 
int main() {
    int a, b, v;
    cin >> a >> b >> v;
    int day;
 
    if ((v - a) % (a - b) == 0) {
        day = (v - a) / (a - b);
    }
    else 
        day = (v - a) / (a - b)+1;
 
    cout << day+1 << endl;
}
cs

 

 

 

오답 원인 분석

 

▶ while문만을 사용할 줄 알았다. 이 문제의 핵심인 걸리는 기간을 수학적으로 표현하는 것을 잡아내지 못해 틀렸다. 

728x90
반응형