ALGORITHM

[JAVA] 백준 2886번- 달팽이는 올라가고 싶다

연듀 2022. 8. 24. 17:19

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

 

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

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

www.acmicpc.net

 

 

시간 제한이 0.15초로 짧다. 그리고 정답 비율도 매우 낮다. 

그리고 역시나 그냥 생각나는대로 이렇게 반복문으로 풀었더니 시간초과가 났다. 

 

 

   int total = 0;
        int day = 0;
        while(total<v)
        {
            day++;
            total += a;
            if(total == v) break;
            total-=b;
        }
        System.out.println(day);

 

 

수학적인 수식으로 풀어야한다.

 

달팽이는 매일 (A - B)씩 V미터까지 올라간다. 

일단 달팽이는 목표 지점에 도착하면 미끌어지지 않는다. 

이것을 감안하면 총 (V - B) 미터를 올라가게 하면 된다. 

 

즉, (V - B) / (A - B) 가 달팽이가 이동한 날의 수다.

이 때 (V - B) / (A - B) 가 0으로 딱 나눠떨어지지 않는다면 하루가 더 소요되기 때문에 +1을 해준다. 

 

 

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
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 = new StringTokenizer(br.readLine());

        int a = Integer.parseInt(st.nextToken());
        int b = Integer.parseInt(st.nextToken());
        int v = Integer.parseInt(st.nextToken());
        
        int day;

        if((v-b)%(a-b)==0) day = (v-b)/(a-b);
        else day = (v-b)/(a-b)+1;

        System.out.println(day);
    }
}

 

 

 

 

근데 여기서 (V-B)에 1을 미리 빼놓고 몫에 무조건 +1을 해주면

int형끼리의 연산이기 때문에 나머지가 있는지 없는지 구분할 필요가 없다. 

 

 

 

int day = (v-b-1)/(a-b)+1;