본문 바로가기
프로그래밍/백준 문제 풀이(자바)

백준 2869번 자바 문제 답/해설(달팽이는 올라가고 싶다 문제)

by 리드민 2021. 12. 16.
반응형

[1] 백준 카테고리
단계별로 풀어보기
기본 수학
4단계 2869번 문제
달팽이는 올라가고 싶다 문제

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

 

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

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

www.acmicpc.net

 

[2] 문제

땅 위에 달팽이가 있다. 이 달팽이는 높이가 V미터인 나무 막대를 올라갈 것이다.
달팽이는 낮에 A미터 올라갈 수 있다. 하지만, 밤에 잠을 자는 동안 B미터 미끄러진다. 또, 정상에 올라간 후에는 미끄러지지 않는다.
달팽이가 나무 막대를 모두 올라가려면, 며칠이 걸리는지 구하는 프로그램을 작성하시오.\


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

 

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

 

3. 예제 입력 1
2 1 5


4.예제 출력 1
4


[3] 정답

1. 정답 해설 미포함

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.StringTokenizer;

public class Main {
	public static void main(String[] args) throws NumberFormatException, 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 count = 0;
		
		count = (V - B) / (A - B);

		if( (V-B)%(A-B) != 0)
			count++;
		
		
		System.out.println(count);
	}
}


2. 정답 해설 포함

import java.io.BufferedReader;
/* BufferedReader 사용을 위해서 java.io.BufferedReader 클래스를 import 한다
Enter를 경계로 인식하고 받은 데이터는 String으로 고정된다 */
import java.io.InputStreamReader;
/* byte 단위 데이터를 문자 단위 데이터로 처리할 수 있도록 변환해주기 위해서
InputStreamReader를 사용한다.
InputStreamReader 사용을 위해서 java.io.InputStreamReader 클래스를 import 한다 */
import java.io.IOException;
/* 예외처리를 위해서 IOException를 사용한다
IOException 사용을 위해서 java.io.IOException 클래스를 import 한다 */
import java.util.StringTokenizer;
/* 공백 단위로 호출하기 위해서 StringTokenizer를 사용한다
StringTokenizer를 사용하기 위해서
StringTokenizer java.util.StringTokenizer 클래스를 import 한다 */

public class Main {
// 접근제어자 public으로 Main 클래스를 선언한다
	public static void main(String[] args) throws NumberFormatException, IOException{
	// 접근제어자 public으로 메모리에 상주하게 리턴값이 없이 main 함수를 선언한다
	
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		// BufferReader 객체 br를 선언한다
		StringTokenizer st = new StringTokenizer(br.readLine(), " ");
		// StringTokenizer 객체 st를 선언한다 이제 공백으로 값을 입력받을 수 있다.
		
		int A = Integer.parseInt(st.nextToken());
		/* int형 변수 A를 선언하고 값을 공백 단위로 구분해서 입력받는다
		Inter.parseInt()로 String형 변수를 int형으로 변환시킨다. */
		int B = Integer.parseInt(st.nextToken());
		/* int형 변수 B를 선언하고 값을 공백 단위로 구분해서 입력받는다
		Inter.parseInt()로 String형 변수를 int형으로 변환시킨다. */
		int V = Integer.parseInt(st.nextToken());
		/* int형 변수 V를 선언하고 값을 공백 단위로 구분해서 입력받는다
		Inter.parseInt()로 String형 변수를 int형으로 변환시킨다. */
		int count = 0;
		// int형 변수 count를 선언한다
		
		count = (V - B) / (A - B);
		// (V-B)/(A-B)를 연산한 값을 변수 count에 저장한다.

		if( (V-B)%(A-B) != 0)
		// (V-B)%(A-B)가 0이 아닐때 밑의 코드가 실행된다.
			count++;
		
		System.out.println(count);
		// count 값을 출력한다
	}
}

(V-B)/(A-B)=0 일 경우 정상 도달 직전에 내려가지 않고 정상에 도착하게 된다. 그래서 그냥 나누어 준 값이 올라가는데 걸리는 일자이다.

코드로 표현하면,

count = (V - B) / (A - B);

 

(V-B)/(A-B)!=0일 경우는 정상에 올라가기 직전에 한번 내려가게 된다. 즉 하루가 더 소요되게 되는 것이다.

코드로 표현하면,

if( (V-B)%(A-B) != 0)
count++;

이다.

 

[4] 기타

import java.util.Scanner;
public class Main {
	public static void main(String[] args) {
		
		Scanner in = new Scanner(System.in);
		
		int A = in.nextInt();
		int B = in.nextInt();
		int V = in.nextInt();
		int count = 0;
		
		while(V>0)
		{
				V=V-A;
				if(V<=0)
				{
					count++;
					break;
				}
				V=V+B;
				count++;
				
		}
		System.out.print(count);
	}
}

이 코드도 맞는거 같으나 사간이 촉박하게 주어져 있기 때문에 시간 초과로 통과하지 못했다. 조건이 0.15ms 내로 코드가 실행되야 되기 때문에 자원을 덜 소비하는 알고리즘을 사용해야 한다.

반응형