[백준 2869번] 달팽이는 올라가고 싶다
백준알고리즘 2869번 : 달팽이는 올라가고 싶다
시간제한이 0.15초이기 떄문에, 그리고 올라가야하는 나무 막대의 길이가 최대 10억이기 때문에
일일히 더해가면서 조건문으로 '지금 달팽이가 올라간 길이가 나무 막대의 길이보다 크거나 같은가?'
라는 식으로 풀면 시간 초과가 날 것으로 생각했다.
그래서 마지막의 전날에 꼭대기까지 올라갈 수 있는 길이를 정의하고, 여기에 1을 더해줌으로써
꼭대기까지 올라가기 위해 필요한 횟수를 정할 수 있었다.
또한, 올라가는 길이 A, 내려가는 길이 B, 총 길이 V가 같을 수도 있기 때문에, 이런 예외 상황도 처리가 필요했다.
"절대 올라가지 못한다면 0으로 표시하시오" 와 같은 조건이 없기때문에, 올라가는 길이 A와 B가 같은 상황이라면,
총 길이 V는 A보다 작거나 같게 함으로써 하루만에 올라갈 수 있도록 문제를 내겠구나, 라고 생각했다.
풀이 과정
1. A, B, V를 담는다
2. 총 길이 V에서 하루만에 올라갈 수 있는 길이 A를 뺀 값(finWalk)을 설정하고,
해당 길이까지 도달하는 데 걸리는 횟수를 구한다.(int)Math.ceil((double)finWalk/(A-B))
// finWalk/(A-B) 가 제대로 나누어 떨어지지 않는다면 해당 값이 무조건 넘는
// 정수값을 취해야 하기 때문에 Math.ceil을 통해 올림하였다.
3. finWalk까지 당도하는 횟수 + 마지막 날(하루)를 출력한다.
4. V보다 A가 크거나 같은 경우, 한 번에 올라갈 수 있다. 해당 조건을 삽입해준다.
<< 백준알고리즘 2869번 반례 >>
5 5 5
100 99 99
999 1 1000
소스 ▽
import java.util.Scanner;
public class Main {// 2869번, 달팽이는 올라가고 싶다.
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int A = sc.nextInt();
int B = sc.nextInt();
int V = sc.nextInt();
if (A>B && A<V) {
int finWalk = V-A;//마지막 발돋움까지 남은 길이
int count = (int)Math.ceil((double)finWalk/(A-B));//finwalk 이상으로 올라가는데 걸리는 횟수
System.out.println(count+1);
}else {//V보다 A가 크거나 같은 경우.
System.out.println("1");
}
}
}
Summary
Math.ceil() : 올림