그림판유저의 은밀한 개발

[BOJ] 백준 2869 - 달팽이는 올라가고 싶다 본문

알고리즘/acmicpc[백준]

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

혀나_0_0 2019. 3. 7. 22:51

백준 2869 - 달팽이는 올라가고 싶다



달팽이는 낮에 a 미터를 올라가고, 밤에 b미터 떨어집니다. (정상을 도달하는 순간 미끄러지지 않으므로, 끝나게 됩니다.)


이런 문제는 DP를 접근하는 것과 같이 작은 문제부터 생각해야 합니다.


먼저, 달팽이는 하루가 지난 다음날 아래와 같이 이동한 것을 알 수 있습니다.


즉, 1일이 지날 때마다 a - b 만큼을 이동하게 됩니다.

일반적으로, 1일에 a - b 만큼을 이동한다는 식을 찾게되면, n * (a - b) >= v 인 n 을 찾으려는 오류를 범하게 됩니다.


여기서 주의할 점은 정상을 도달하는 순간 미끄러지지 않는다는 점입니다.


(n + 1)번째의 날에 나무 위에 도달한다고 가정한다면,

n 번째 날이 지난 달팽이의 이동거리는 n * (a - b) 이게 되고, 낮동안 a 만큼 이동해 v (정상)에 도달하게 됩니다.


이 부분을 식을 세워본다면 n * (a - b) + a >= v 인 n + 1 을 찾으면 성공입니다. 


위의 식을 이용하여 작성한 코드는 아래와 같습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import java.util.Scanner;
 
public class Main {
 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner sc = new Scanner(System.in);
        double a = sc.nextDouble();
        double b = sc.nextDouble();
        double v = sc.nextDouble();
        
        // v <= (a-b)n + a 인 n 값을 찾는다.
        // (v-a)/(a-b) <= n
        // n은 달팽이가 올라가기 직전 날이므로, n+1을 출력한다.
    
        if(v == a) System.out.println(1);
        else System.out.println((long)Math.ceil((v-a)/(a-b))+1);
    }
 
}
cs





'알고리즘 > acmicpc[백준]' 카테고리의 다른 글

[BOJ] 백준 2573 - 빙산  (0) 2019.03.07
[BOJ] 백준 1799 - 비숍  (0) 2019.03.07
[BOJ] 백준 10216 - Count Circle Groups  (0) 2019.03.07
[BOJ] 백준 5557 - 1학년  (0) 2019.03.06