백준 온라인 저지 문제풀이/JAVA

[baekjoon 2869번] 수학 1 - 달팽이는 올라가고 싶다

Good Program Good Programmer 2020. 12. 5. 11:50

문제


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

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

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

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

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


문제풀이

 

이 문제는 [1712번] 손익분기점과 굉장히 유사한 문제이다. 손익분기점에서도 그랬듯이 만약 반복문을 사용해서 처리하려한다면 시간초과가 발생할 것이다. 그렇다면 / 이나 %을 이용해서 문제를 풀어야 할 것이다.

 

처음에는 단순히 "V를 (A-B)로 나누면 되는 거 아닌가?" 라고 생각했다. 하지만 그렇게하면 오답이 발생한다. 왜냐하면 

A = 2, B = 1, V = 5일 때 달팽이는 3일차에는 3의 높이까지 올라갔을 것이다. 하지만 4일차에 5의 높이까지 올라갈 것이고 달팽이는 나무 막대 꼭대기에서는 미끄러지지 않기 때문에 4일차에 정상에 도달할 것이지만 V/(A-B)를 하면 5가 나오기 때문이다.

 

이런 문제를 방지하려면 나무막대 꼭대기에서 (A-B)만큼을 A보다 작거나 같을때까지 빼주고 1을 더하면 될 것이다. 하지만 뺄셈을 이용하면 시간초과가 발생한다. 그렇다면 어떻게 해야 할까?

 

사실 달팽이가 1번 올라갈 거리를 구하는 것은 중요하지 않다. 해당 거리가 있는지 없는지만 판별하면 해당 거리를 1번 올라갈 것이기 때문이다. 따라서 %을 이용해서 해당 거리가 있는지 없는지만 확인해줄 것이다.

 


소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import java.io.*;
import java.util.StringTokenizer;
 
public class Main {
    public static void main(String args[]) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
 
        StringTokenizer st = new StringTokenizer(br.readLine());
        int A = Integer.parseInt(st.nextToken());
        int B = Integer.parseInt(st.nextToken());
        int V = Integer.parseInt(st.nextToken());
        int cnt = (V-A)/(A-B);
 
        if((V-A)%(A-B)!=0) cnt++;
 
        bw.write(++cnt+"");
        bw.flush();
        bw.close();
    }
}
cs

 

15번 줄 : 만약 달팽이가 하루동안 올라가는 거리가 낮에 올라가는 거리보다 작을 때 카운트가 안되는 경우 카운트가 되도록 해준다.

 

17번 줄 : cnt에 ++를 해주는 이유는 cnt가 나무 막대의 높이에서 달팽이가 낮 동안 올라갈 거리를 제외한 일 수이기 때문에 낮에 1번 더 올라갈 것을 생각해야하기 때문이다.

 


느낀점

 

알면 쉽지만 모르면 어려운 문제였다.