BAEKJOON/단계별로 풀어보기

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

말하는 알감자 2022. 8. 8. 00:12

🔒 문제

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

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

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

⌨ 입력

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

🖨 출력

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

📚 예제

Ex1)

2 1 5

4

Ex2)

5 1 6

2

Ex3)

100 99 1000000000

999999901

📌 풀이

달팽이가 이동하는 거리는 낮에는 A만큼 늘어나고, 밤에는 B만큼 줄어든다.
|걸린 날짜|이동 거리|
|---------|---------|
|1|A|
|2|A+(A-B) * 1|
|3|A+(A-B) * 2 |
|···|···|
|n|A+(A-B) * (n-1)|

V = A+(A-B) * (n-1)
V-A = (A-B) * (n-1)
n-1 = (V-A)/(A-B)
n = (V-A)/(A-B)+1
이라는 식이 만들어 진다.
그런데 n은 int형이라 나머지가 생겨도 버리기 때문에 (V-A)%(A-B)가 0이 아닐 경우 +1을 더 해 준다.
아니면 올림 함수 ceil을 사용하여
n = ceil((double)(V - A) / (A - B)) + 1 을 사용한다

🔑 c언어 코드

#include<stdio.h>
#include<math.h>

int main()
{
    int A, B, V;
    scanf("%d %d %d", &A, &B, &V);
    int d;

    if ((V - A) % (A - B) > 0)
        d = (V - A) / (A - B) + 2;
    else
        d = (V - A) / (A - B) + 1;

    printf("%d", d);

    return 0;
}
#include <stdio.h>
#include <math.h>

int main()
{
    int A, B, V;
    scanf("%d %d %d", &A, &B, &V);
    int d = ceil((double)(V - A) / (A - B)) + 1;
    printf("%d", d);

    return 0;
}

'BAEKJOON > 단계별로 풀어보기' 카테고리의 다른 글

[BOJ] 2775번 : 부녀회장이 될테야  (0) 2022.08.10
[BOJ] 10250번 : ACM 호텔  (0) 2022.08.09
[BOJ] 1193번 : 분수찾기  (0) 2022.08.07
[BOJ] 2292번 : 벌집  (0) 2022.08.07
[BOJ] 1712번 : 손익분기점  (0) 2022.08.06