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

RudinP·2023년 4월 4일
0

BaekJoon

목록 보기
15/77

땅 위에 달팽이가 있다. 이 달팽이는 높이가 V미터인 나무 막대를 올라갈 것이다.
달팽이는 낮에 A미터 올라갈 수 있다. 하지만, 밤에 잠을 자는 동안 B미터 미끄러진다. 또, 정상에 올라간 후에는 미끄러지지 않는다.
달팽이가 나무 막대를 모두 올라가려면, 며칠이 걸리는지 구하는 프로그램을 작성하시오.

입력

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

출력

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

생각

a 미터 낮
b 미터 밤
v 미터 나무막대

v -= a
if( v < 0 ) break;
v += b 를 매 반복마다 실행

왜 정답률이 30퍼지?

첫 시도

namespace SongE
{
    public class Program
    {
        static void Main(string[] args)
        {
            int[] ints = Array.ConvertAll(Console.ReadLine().Split(), s => int.Parse(s));
            int a = ints[0], b = ints[1], v = ints[2];
            int day = 0;
            while (true)
            {
                v -= a;
                day++;
                if (v <= 0) break;
                v += b;
            }
            Console.WriteLine(day);
        }
    }
}

인데, 내 생각엔 많이 반복할수록 0.25초만에 실행이 되지 않을 것 같아 제출하지 않고 찾아보았다.

수학적 해결

달팽이는 하루에 (a-b) 미터를 올라간다. 근데 달팽이가 목표지점에 도달한 날에는 미끄러지면 안되니까, 총 (v-b) 미터를 올라가면 된다. (v-b)가 (a-b)로 나눠떨어지지 않으면 +1일 하면 된다.

namespace SongE
{
    public class Program
    {
        static void Main(string[] args)
        {
            int[] ints = Array.ConvertAll(Console.ReadLine().Split(), s => int.Parse(s));
            int a = ints[0], b = ints[1], v = ints[2];
            int day =((v - b) % (a - b) == 0 )? ((v-b) / (a-b)) : ((v-b) / (a-b) + 1);

            Console.WriteLine(day);
        }
    }
}

profile
곰을 좋아합니다. <a href = "https://github.com/RudinP">github</a>

0개의 댓글