Post

[백준] 2869번 - 달팽이는 올라가고 싶다 [Java][C++]

[백준] 2869번 - 달팽이는 올라가고 싶다 [Java][C++]

문제 링크


1. 문제 풀이

달팽이가 높이 $V$ 인 나무 막대를 올라가는데 하루에 $A$ 미터를 올라간 후 $B$ 미터를 내려오는 과정을 반복한다. 시간 제한으로 $V$ 미터가 될 때까지 이를 반복하는 방식으로는 해결할 수 없어서 수식으로 며칠이 걸리는지 찾아야 한다.

달팽이가 $V$ 미터인 나무 막대에 도착하려면 도착하기 전날에는 $V - A$ 미터 이상은 올라와야 한다. 여기서 $A$ 미터를 다음 날 올라가면 정상에 도착할 수 있다. 이때 $V - A$ 미터를 올라오는 데는 하루에 순수하게 올라갈 수 있는 높이가 $A - B$ 미터이므로 $\dfrac{V - A}{A - B}$ 일이 걸리게 된다. 이때 일 수는 자연수이어야 하므로 소수점에 해당하는 수가 있으면 올림 나눗셈으로 계산을 해줘야 한다. 예를 들면 $5.7$ 일로 계산되면 $6$ 일이 걸리는 것이다. 따라서 올림 나눗셈을 위해 분자에 분모 $-1$ 을 더해준 $\dfrac{V - A + (A - B - 1)}{A - B} = \dfrac{V - B - 1}{A - B}$ 일이 도착하기 하루 전날까지 걸리는 기간이고 여기서 마지막 날 한번 더 오르면 정상에 도착할 수 있다.


2. 코드

1. 수학 [Java]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws 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());

        System.out.println((V - B - 1) / (A - B) + 1);
    }
}

2. 수학 [C++]

1
2
3
4
5
6
7
8
9
10
11
#include <bits/stdc++.h>
using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int a, b, v;
    cin >> a >> b >> v;
    cout << (v - b - 1) / (a - b) + 1;
}

3. 풀이 정보

1. 수학 [Java]

언어시간메모리코드 길이
Java 11104 ms14272 KB485 B

2. 수학 [C++]

언어시간메모리코드 길이
C++ 170 ms2020 KB198 B

This post is licensed under CC BY 4.0 by the author.