https://www.acmicpc.net/problem/2869
2869번: 달팽이는 올라가고 싶다
첫째 줄에 세 정수 A, B, V가 공백으로 구분되어서 주어진다. (1 ≤ B < A ≤ V ≤ 1,000,000,000)
www.acmicpc.net
문제
땅 위에 달팽이가 있다. 이 달팽이는 높이가 V미터인 나무 막대를 올라갈 것이다.
달팽이는 낮에 A미터 올라갈 수 있다. 하지만, 밤에 잠을 자는 동안 B미터 미끄러진다. 또, 정상에 올라간 후에는 미끄러지지 않는다.
달팽이가 나무 막대를 모두 올라가려면, 며칠이 걸리는지 구하는 프로그램을 작성하시오.
입력
첫째 줄에 세 정수 A, B, V가 공백으로 구분되어서 주어진다. (1 ≤ B < A ≤ V ≤ 1,000,000,000)
출력
첫째 줄에 달팽이가 나무 막대를 모두 올라가는데 며칠이 걸리는지 출력한다.
예제 입력 1
2 1 5
예제 출력 1
4
예제 입력 2
5 1 6
예제 출력 2
2
예제 입력 3
100 99 1000000000
예제 출력 3
999999901
👉 풀이과정
while문을 사용해서
int day = 0;
int up = 0;
while (up < v) {
up += a;
day++;
if (up >= v) {
break;
}
up -= b;
}
이렇게 작성했는데 시간초과가 생겼다..ㅠ
반복문을 제거하고 효율적인 알고리즘을 생각했다.
(v - b - 1): 나무 막대의 높이(V)에서 밤에 미끄러지는 높이(B)를 빼고, 1을 뺀다.
이렇게 하는 이유는 달팽이가 정상에 도달한 후에는 더 이상 미끄러지지 않기 때문!
(a - b): 낮에 올라가는 높이(A)에서 밤에 미끄러지는 높이(B)를 뺀다.
(v - b - 1) / (a - b): 달팽이가 정상에 도달하기 위해 필요한 횟수를 계산한다. 이 값은 정상에 도달하기 전까지 달팽이가 올라갔다가 미끄러지는 횟수.
+ 1: 정상에 도달한 다음에는 더 이상 미끄러지지 않기 때문에 정상에 도달했을 때의 이동
📌 제출코드
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int a = scan.nextInt();
int b = scan.nextInt();
int v = scan.nextInt();
int day = (v - b - 1) / (a - b) + 1;
System.out.println(day);
}
}
끝!
'코딩테스트 > JAVA' 카테고리의 다른 글
| [JAVA/백준 1427번] 소트인사이드 (1) | 2023.12.05 |
|---|---|
| [JAVA/백준 10845번] 큐 (1) | 2023.12.03 |
| [JAVA/백준 10828번] 스택 (0) | 2023.12.01 |
| [JAVA/백준 4344번] 평균은 넘겠지 (0) | 2023.11.30 |
| [JAVA/백준 1157번] 단어 공부 (0) | 2023.11.26 |