본문 바로가기

기록/알고리즘

백준 2869번) 달팽이는 올라가고 싶다

SMALL

시간초과 난 코드

import java.io.IOException;
import java.util.Scanner;
public class Main {
	public static void main (String args[]) throws IOException { 
		Scanner scan = new Scanner(System.in);
		
		int a = scan.nextInt();
		int b = scan.nextInt();
		int v = scan.nextInt();
		
		int cur = 0;
		int day = 0;
		while(true) {
			day++;
			cur += a;
			
			if(cur >= v) {
				break;
			}
			cur -= b;
			
		}
		System.out.println(day);
	}
}

 

 

반복문으로 일일이 계산했더니 시간초과 오류가 뜬다.

 

수정한 코드

import java.io.IOException;
import java.util.Scanner;
public class Main {
	public static void main (String args[]) throws IOException { 
		Scanner scan = new Scanner(System.in);
		
		int a = scan.nextInt();
		int b = scan.nextInt();
		int v = scan.nextInt();
		
		int per = a - b;
		int day = ((v - a) / per) + 1;
		
		if((v - a) < a) {
			if((v -a) == 0) {
				System.out.println(1);
			}else {
				System.out.println(day + 1);
			}
		} else {
			int temp = day * per;
			if (v >= temp) {
				System.out.println(day);
			} else {
				System.out.println(day - 1);
			}
		}
	}
}

 

논리는 다음과 같다

최종 날짜 day = 1 + (n - 1)번의 올라갔다 내려갔다의 반복

따라서 (v - a) / (a - b)의 형태로 해주고

첫날 올라가고 남은 높이가 올라갈 수 있는 높이보다 큰지 / 작은지를 판별하여 조건문으로 나눴다.

 

.

.

아직도 반례가 있는것같은데 찾는중.

 

 

해결


 

SMALL