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

배수연·2024년 3월 15일

algorithm

목록 보기
16/45

🔗 백준 2869 - 달팽이는 올라가고 싶다

문제

알고리즘 분류

  • 수학

풀이

처음 시도했던 코드

  • 처음에는 반복문을 이용해 V미터가 될 때까지 A를 더하고 B를 빼기를 반복하여 반복횟수를 저장했음
        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 count = 0;
        int position = 0;

        for(int i = 1; ; i++){
            position += A;
            position -= B;
            count++;
            if(position+B >=V){
                //B를 더하는 이유 : 정상에 올라가면 미끄러지지 않기 때문
                break;
            }
        }
        System.out.println(count);
  • 그러나 이 경우 시간초과가 떴고,
    - 질문 게시판에서 이 문제는 O(1)만에 풀어야한다는 답글을 발견하고 아래 코드와 같이 수정

1. 입력

        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());

2. 도개걸윷모 switch-case문 추가

  • 정상에 올라간 후에는 미끄러지지 않으므로, 달팽이가 올라가야 하는 높이는 V-B미터
  • 또 낮과 밤을 거쳐 달팽이가 하루에 올라갈 수 있는 거리는 A-B미터 (단, A>B)
  • 한 번에 구하기 위해 (V-B)/(A-B)을 해주되, 딱 나누어떨어지지 않는 경우는 이 결과값에 +1을 해주어야한다.
    - 따라서 Math라이브러리의 ceil(올림)함수를 이용
        int res = (int)Math.ceil((double)(V-B) / (A-B));
        System.out.println(res);

전체 코드

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));
        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 res = (int)Math.ceil((double)(V-B) / (A-B));
        System.out.println(res);
    }
}

0개의 댓글