본문 바로가기

1.프로그래밍/알고리즘

[알고리즘] 백준 2869번 달팽이는 올라가고 싶다 Java

728x90
반응형

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

문제

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

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

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

입력

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

출력

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

Code


import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.StringTokenizer;

public class Main{
    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        StringTokenizer st;
        st = new StringTokenizer(br.readLine(), " ");

        int A = Integer.parseInt(st.nextToken());
        int B = Integer.parseInt(st.nextToken());
        int V = Integer.parseInt(st.nextToken());


        int x = (V-B) / (A-B);
        if( (V-B) % (A-B) != 0){
            x++;
        }

        System.out.println(x);
    }
}

Point

하루에 일정량 A값이 올라가고 B값이 줄어든다.
다음날 A값이 올라가서 저녁이 되기 전 V에 도달하게 되면 종료되게 된다.


그렇게 되면 단순히 나눠서 되는것이 아닌 B값을 미리 한번 제거하고 나누어주고, 나눠떨어진다면 해당 몫이 될 것이고,
나누어 떨어지지 않다면 즉, 나머지가 존재하면 하루를 더 더해주면 된다.

처음 틀린 이유는 너무 단순히 생각해서 while을 통해 풀었다.
하지만 이 문제의 시간제한은 0.15초이다.


// 하루 올라가는 높이 todayV = A-B
        int todayV = 0;
        int count= 0;
        while(true){
            count++;
            todayV = todayV + A;
            if(todayV >= V){
                break;
            }
            todayV = todayV - B; 
        }

위와 같이 하면 변수가 커질 경우에 따라 시간또한 많이 걸리게된다.
그렇기에 다르게 접근하여 값을 도출해보았다.

위의 Code로 제출할 경우 126ms가 걸리게 된다.
더 간단한 코드는 구상을 못하겠다.... 수학적 사고방식이 부족한것 같다.

728x90
반응형