김펭귄 관찰일기

https://www.acmicpc.net/problem/2869

 

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

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

www.acmicpc.net

 

 

1. 문제


💡 문제

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

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

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

💡 입력

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

💡 출력

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

 

 

 

2. 풀이


#include <stdio.h>

int main(){
    int v = 0, a = 0, b = 0, count = 0;
    
    scanf("%d", &a);
    scanf("%d", &b);
    scanf("%d", &v);
    
    v -= a;
    a -= b;

    count = v / a + 1;
    
    if (v % a != 0) count++;
    
    printf("%d", count);
}

 

 

3. 메모


 살짝 헷갈렸지만 그래도 첫 시도만에 성공했다..! 대체 얼마만의 첫 트 성공인지..

 달팽이는 하루 A미터 올라가고, B미터만큼 미끄러진다. 높이가 V일 때, 정상에 도착하는데 몇 일이 필요한가를 묻고 있다. 걸리는 일 수를 X라고 가정하고 식으로 풀어보면 아래와 같은 식을 얻을 수 있다.

 

X > (V - A) / (A - B)

 

 달팽이가 하루하루 꾸준히 오르고 내리다보면 언젠가 'V - A' 보다 위에 위치하고 있을 것이다. 달팽이는 다음 날 A 만큼 올라가면 정상에 도착하기에 위 식을 만족하는 X를 구하면 된다.

 

#include <stdio.h>

int main(){
    int v = 0, a = 0, b = 0, count = 0;
    
    scanf("%d", &a);
    scanf("%d", &b);
    scanf("%d", &v);
    
    // 정상까지의 거리에서 달팽이가 하루에 올라갈 수 있는 높이값을 빼준다.
    // 달팽이는 v 값보다 큰 값을 가지는 위치에 있어야 다음 날 정상에 도착한다.
    v -= a;
    
    // 달팽이가 하루에 올라갈 수 있는 높이값에 미끄러지는 값을 빼주면 하루에 올라간 높이값이 나온다.
    a -= b;

    // 여기서 count는 총 걸린 일 수를 뜻한다.
    // 다음 날 정상에 도착할 수 있는 높이를 하루 총 올라갈 수 있는 높이로 나눠주면 몇 일이 걸리는지 알 수 있다.
    // 다음 날은 도착하니 1을 더해줬다.
    count = v / a + 1;
    
    // v를 a로 나눴는데도 나머지가 남았다면, 이는 두 가지 경우이다.
    // a값이 v보다 작은데 완전히 나눠지지 않을 때 (ex. v = 3, a = 2)
    // a값이 v보다 큰데 완전히 나눠지지 않을 때 (ex. v = 1, a = 4)
    // 두 경우 모두 count가 1만큼 부족하다. 그러니 나머지가 남을 땐 1을 더해주자.
    
    if (v % a != 0) count++;
    
    printf("%d", count);
}
profile

김펭귄 관찰일기

@Penguin.Kim