본문 바로가기
  • 1+1=3
개발삽질/잡다한 개발기록

2021/12/06-브론즈1-달팽이는 올라가고 싶다.

by 여스 2021. 12. 6.
반응형

문제링크: 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

 


내 시도

첫 시도(시간초과)

import java.util.Scanner;

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

        Scanner in = new Scanner(System.in);
        int A = in.nextInt();
        int B = in.nextInt();
        int V = in.nextInt();

        System.out.println(answer(A,B,V));

        in.close();
    }

    public static int answer(int a, int b, int v){
        int i = 0;
        int height = 0;
        while(true){
            i++;
            height = height + a;
            if(height >= v) break;
            height = height - b;
        }
        return i;
    }
}

원인분석:

 

키포인트는 정상에 올라가면 미끄러지지 않는다임.

while문을 쓰지 않기로 결정.

그런데도 시간제한이 걸렸다. 아니 왜?

검색해보니 그냥 스캐너로 입력을 받는게 시간이 걸렸나보다.

BufferedReader와 StringTokenizer 를 사용해 입력값을 처리했더니 되었다.

 

성공한 코드:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;
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());
        
        System.out.println(answer(A,B,V));

    }

    public static int answer(int a, int b, int v){
        int onedayPower = a-b;
        int days = (int) Math.ceil((double)(v-a)/onedayPower);


        return days+1;
    }
}
반응형

댓글