Study/Baekjoon

Baekjoon2869: 달팽이는 올라가고 싶다, 코드 길이는 연산속도와 비례하지 않는다

devyoseph 2021. 10. 12. 03:30

문제

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

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

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

입력

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

출력

첫째 줄에 달팽이가 나무 막대를 모두 올라가는데 며칠이 걸리는지 출력한다.

 

풀이

반복문을 활용한다
근데 시간초과로 나온다. 방법이 이게 아닌가 보다

import java.util.Scanner;
public class Main {
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 now = 0;
	 int day = 0;
	 while(now<V) {
		 now -=B;
		 if(day==0) {
			 now = 0;
		 }
		 now += A;
		 day ++;
	 }
	 System.out.println(day);
}
}

수학적인 계산을 진행한다
달팽이가 도착하기 전 날을 day-1이라고 하자
그 날 밤 달팽이는 (day-1)*(A-B)만큼 올라가 있을 것이다
그리고 도착 당일날(day) 낮 때의 높이는 (day-1)*(A-B)+A이다
부등식을 만들면  (day-1)*(A-B)+A >= V이다
정리하면 day >= (V-A)/(A-B) + 1 이 된다

조건
숫자데이터를 int로 받는다
(V-A)/(A-B)가 정확히 나누어 떨어지는 경우가 아니면 day = (V-A)/(A-B)+2이 된다
정확히 나누어 떨어질 때만 -1을 해주면 된다

import java.util.Scanner;
public class Main {
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 = (V-A)/(A-B)+2;
	 if( (V-A)%(A-B)==0) {
		 day--;}
	 System.out.print(day);
}}

?

import java.util.Scanner;
public class Main {
public static void main(String[] args){
	 Scanner sc = new Scanner(System.in);
	 double A = sc.nextInt();
	 double B = sc.nextInt();
	 double V = sc.nextInt();
	 int day = (int)Math.ceil((V-A)/(A-B)+1);
	 System.out.print(day);
}}

??

 

 

 

어쩔 수 없이 buffer를 사용한다

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
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 day = (V-A)/(A-B)+2;
	 if((V-A)%(A-B)==0) {
		  day--;
	 }
	 System.out.print(day);
}}

 

 

scanner는 숏코딩 용도인가 보다

'Study > Baekjoon' 카테고리의 다른 글

Baekjoon1011: Fly me to the Alpha Centauri  (0) 2021.10.13
Baekjoon10250: ACM 호텔  (0) 2021.10.12
Baekjoon1193: 분수찾기  (0) 2021.10.12
Baekjoon2292: 벌집  (0) 2021.10.12
Baekjoon1712: 손익분기점, Scanner의 위대함  (0) 2021.10.12