[백준] 2869. 달팽이는 올라가고 싶다

진예·2023년 9월 30일
0

Baekjoon : JAVA

목록 보기
7/76
post-thumbnail

📌 문제

[2869] 달팽이는 올라가고 싶다

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

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

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

⬇️ 입력

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

⬆️ 출력

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

💡 코드

✅ 처음에 문제를 읽었을 때 하루에 A미터를 올라가고 B미터씩 미끄러지니까 하루에 총 A-B 미터씩 올라가게 되고, 곧 5m를 올라가려면 5일이 걸리겠다! 라고 생각했는데 예제는 4일이라길래 뭔가 했는데,, "정상에 올라간 후에는 미끄러지지 않는다." 라는 조건을 고려하지 않아서 그런거였다!

정상 조건을 고려하면 4일차 낮에 정상에 도달하기 때문에 더이상 미끄리지지 않으므로 4일만에 올라갈 수 있게 된다!

⏱️ 위 규칙을 while문에 담아서 if문을 통해 정상에 도착하게 되면 반복문을 빠져나가 더이상 미끄러지지 않음을 구현했는데,, 시간초과가 떴다,, 시간 초과는 처음이라 문제를 다시 보니 시간제한이 0.25초였다,,! 어쩐지 정답률이 낮더라,,

import java.io.*;
import java.util.StringTokenizer;
public class Main {
	public static void main(String[] args) throws IOException {
		
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		
		StringTokenizer st = new StringTokenizer(br.readLine());
		int day = Integer.parseInt(st.nextToken());
		int night = Integer.parseInt(st.nextToken());
		int v = Integer.parseInt(st.nextToken());
		int cnt = 0;
		
		while(true) {
			cnt++;
			v -= day;
			if(v <= 0) break;
			v += night;
		}
		bw.write(cnt + "");
        
		br.close();
		bw.close();
	}
}

✅ 시간을 맞추려면 반복문을 최소한의 수식으로 만들어야 한다,,

달팽이가 하루에 올라갈 수 있는 거리는 A-B미터이므로, V미터까지 걸리는 총 시간은 V/A-B 이다. 그런데, 정상에 도착하면 미끄러지지 않는다는 조건을 만족해야 하므로, V-B/A-B를 수행해주면 된다. 여기서 몫이 딱 나누어 떨어지면 , 나머지가 남는다면 마지막 날에 나머지만큼 올라가줘야 하므로 몫+1 일이 총 시간이 된다!

import java.io.*;
import java.util.StringTokenizer;
public class Main {
	public static void main(String[] args) throws IOException {
		
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		
		StringTokenizer st = new StringTokenizer(br.readLine());
		int day = Integer.parseInt(st.nextToken());
		int night = Integer.parseInt(st.nextToken());
		int v = Integer.parseInt(st.nextToken());
		
		int cnt = (v - night) / (day - night); 
		if((v - night) % (day - night) == 0) bw.write(cnt + "");
		else bw.write(cnt+1 + "");
		
		br.close();
		bw.close();
	}
}

profile
백엔드 개발자👩🏻‍💻가 되고 싶다

0개의 댓글