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

김민성·2022년 8월 12일
0

알고리즘 퀴즈

목록 보기
28/55
post-thumbnail

Baekjoon_2869 - 달팽이는 올라가고 싶다

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

문제

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

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

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

입력

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

출력

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


해결방법

  • A, B, V의 최댓값이 1,000,000,000이고 시간제한은 0.15초 이므로 반복문으로 구현하면 시간초과가 나오기 때문에 최대한 간결한 식으로 해결해야 한다.
  • 각 날짜의 낮을 기준으로 올라간 거리를 살펴보자
    • 1일차 낮 : A
    • 2일차 낮 : (A - B) + A
    • 3일차 낮 : (A - B) + (A - B) + A
    • 4일차 낮 : (A - B) + (A - B) + (A - B) + A
    • k일차 낮 : (A - B) * (k - 1) + A
  • 이 때 k일차 낮에 올라간 거리가 V와 같다면, k일차에 나무 막대를 모두 올라갈 수 있을 것이다.
  • k일차 낮에 올라간 거리가 V보다 작다면, 그 다음날이 되서야 나무 막대를 모두 올라갈 수 있을 것이다.
  • 따라서 (A - B) * (k - 1) + A = V 라는 식에서 도출한 k = (V - B) / (V - A) 에서의 k 값을 봤을 때
    • k 가 정수로 나눠떨어진다면 답은 k
    • k 가 소수점이 나온다면 답은 k+1

코드

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

public class Baekjoon_2869 {
    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 result = (v - b) / (a - b);
        if ((v - b) % (a - b) != 0) {
            result++;
        }

        System.out.println(result);
    }
}

0개의 댓글