백준/브론즈

백준 2869번 달팽이는 올라가고 싶다(C언어)

quail 2023. 7. 1. 23:01

문제 소개

난이도: 브론즈 1 

어렸을 때 수학 문제집에서 한번쯤은 다들 보셨을 문제 같다.

낮에는 a미터 올라가고 밤에는 b미터 내려가는 달팽이가 v미터의 막대기를 오르려면 며칠이 걸리는지 물어보는 문제이다.

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

입력

세 정수 a, b, v가 공백으로 구분되어서 주어진다. (1 ≤ B < A ≤ V ≤ 1,000,000,000)

출력

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

예제 입력과 출력

입력1: 2 1 5
출력1: 4

입력2: 5 1 6
출력2: 2

입력3: 100 99 1000000000
출력3: 999999901

생각의 흐름

맨 처음에는 낮에 올라가는 높이와 밤에 내려가는 높이의 차를 구한 다음 그 값을 막대의 높이 이상이 될 때까지 몇 번 반복해 더해야 하는지 구하려 했다. 그래서 코드를 대충 이렇게 짰다.

#include <stdio.h>

int main() {
    int a, b, v;
    scanf("%d%d%d", &a, &b, &v);
    
    int h = 0, ans = 0;
    
    while(1) {
        ans++;
        h += a;
        if (h >= v) {
            break;
        }
        h -= b;
    }
    
    printf("%d", ans);
}

그런데 위 경우를 실행해봤더니만 엄청 오래 걸렸다.

그래서 다른 방법을 고민해 봤다.

어짜피 맨 마지막날에는 올라가기만 하지 않는가

원래 막대 길이에서 맨 마지막날에 올라가는 길이를 뺀 길이만큼 이동하는데 걸리는 날짜를 구해 1을 더하면 된다.

그래서 코드를 다음과 같이 짰다.

코드

#include <stdio.h>

int main() {
    int a, b, v;
    scanf("%d%d%d", &a, &b, &v);
    int d, i = a;
    
    while (1) {
        if ((v - i) % (a - b) == 0) {
            d = (v - i) / (a - b) + 1;
            break;
        }
        i--;
    }
    
    printf("%d", d);
}   

먼저 변수 a, b, v를 입력받은 후 i라는 변수를 선언해 낮에 올라가는 높이값을 저장한다.

마지막날 전날까지 올라간 거리를 달팽이가 올라가는데 며칠 걸리는지 구한다.
ㄴ> i 는 마지막날 낮에 올라간 거리를 뜻한다.
ㄴ> (v - i) 는 마지막날 전날까지 올라간 거리를 뜻한다.
ㄴ> (a - b) 는 하루에 올라가는 거리를 뜻한다.
ㄴ> i 의 값을 줄여가면서 (v - i)가 (a - b)로 나누어 떨어지는지 구한다.(하루에 달팽이는 (a - b)미터씩밖에 못 올라가므로 꼭 나누어 떨어져야 한다.)

마무리

설명이 주저리 주저리 길고 문장 하나하나가 읽기 어려울정도로 엉망인 것 같다. 필력을 더 키우고 와야 할 것 같다.