티스토리 뷰

문제

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

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

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

입력

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

 

 

첫번째 풀이

 

import java.util.Scanner;

// (1 ≤ B < A ≤ V ≤ 1,000,000,000)!
public class ct3 {
    public static void main(String[] args) {
        Scanner a = new Scanner(System.in);
        Scanner b = new Scanner(System.in);
        Scanner v = new Scanner(System.in);

        // 아침에 올라간 높이
        int A = a.nextInt();
        // 저녁에 떨어진 높이
        int B = b.nextInt();
        // 총 높이
        int V = v.nextInt();
        // 카운트
        int cnt = 0;

        int C;
        int D = 0;

        while(D < V){
            // 하루에 올라간 높이
            C = A - B;
            // 올라간 높이에 다음날의 C를 추가한 것이 D
            D += C;
            if(D >= V){
                break;
            }
            cnt++;
        }
        System.out.println(cnt);
    }
}

두번째 예제인  5, 1, 6 을 했을때 기대값인 2일이 나오지 않고 1이 나온다.

2일 째에서 break의 위치가 cnt를 진행하지 않고 더한 즉시 출력이 되어서 그런것 같다.

그렇다고 cnt++의 위치를 if문 안에 넣으니 예제1의 예제값이 1이 추가되어서 나온다.

 

일단 돌려보니 아래와 같은 에러가 나옴

런타임 에러 (NoSuchElement)

Scanner에서 이 에러가 발생하는 경우는 더 이상 입력받을 수 있는 값이 없을 때 입니다.

 

Scanner (Java Platform SE 8 )

Scans the next token of the input as a float. This method will throw InputMismatchException if the next token cannot be translated into a valid float value as described below. If the translation is successful, the scanner advances past the input that match

docs.oracle.com

라고 나와 있고 더 찾아보니 시간도 반복문을 사용하면 오래걸려 정답처리가 안된다고 한다.

 

 

참고 풀이

import java.io.*;
import java.util.StringTokenizer;

// (1 ≤ B < A ≤ V ≤ 1,000,000,000)!
public class ct3 {
    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 days = (v-a) / (a-b); // 달팽이가 정상에 오르기 전날까지의 날
        if((v - a) % (a-b) != 0) // 달팽이가 하루에 오르는 높이보다 정상까지의 높이가 짧을때
            days++;
        System.out.println(days+1); // 마지막날 오른 기록은 계산식에 포함되어있지 않으므로 출력에 1일을 더해준다.
    }
}

알아야 할것 : BufferedReader, StringTokenizer, 풀이 과정

'사견 > 알고리즘' 카테고리의 다른 글

[Java] 더하기 사이클  (0) 2022.07.02
[Java] 소수 구하기  (0) 2022.06.30
[Java] ACM 호텔  (0) 2022.06.30
[Java] 베르트랑 공준  (0) 2022.06.28
[Java] 설탕 배달  (0) 2022.06.28
Comments