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

문제출처

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

 

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

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

www.acmicpc.net

import java.util.Scanner;
public class Q2869 {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int A = sc.nextInt();
		int B = sc.nextInt();
		int V = sc.nextInt();
		
		int day = -1;
		int position = 0;
		while(position < V) {
			day++;
			position += A;
			position -= B;
		}
		System.out.println(day);
		sc.close();
	}
}

첫번째로 내가 했던 코드다. 시간초과로 틀렸다.

 

시간초과인 이유는 예를들어 나무가 10억미터라면 while문이 10억번 돌아버리는 대참사가 일어나기도 하는 것이다...

반복문을 사용하지않고 푼경우

import java.util.Scanner;
public class Q2869 {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int A = sc.nextInt();
		int B = sc.nextInt();
		int V = sc.nextInt();
		
		int day = -1;
		int move = A - B;
		
		if(V % move == 0){
			day = V / move - 1;
		}
		else {
			day = V / move + 1;
		}
		
		System.out.println(day);
		sc.close();
	}

}

틀렸다.

 

문제를 정확하게 이해 못했던 부분이 하나있다.

바로 정상에 도달하면 미끄러지지 않는다는 조건...

즉 예제 2 1 5를 했을때 4일이 걸리는 이유는 4번째 날에 밤이 되기전에 정상에 도달하기 때문이다.

 

그래서 저 코드는 예를들어 하루에 4민터 올라가고 1미터 미끄러질때 막대의 길이가 4이면 답이 1이어야하는데 2가 출력되는 오류가 있다.

 

 

import java.util.Scanner;
public class Q2869 {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int A = sc.nextInt();
		int B = sc.nextInt();
		int V = sc.nextInt();
		
		int day = 0;
		
		if((V - B) % (A - B) == 0) {
			day = (V - B) / (A - B);
		}
		else {
			day = (V - B) / (A - B) + 1;
		}
		
		System.out.println(day);
		sc.close();
	}

}

최종 맞은것

myoskin