백준

백준 2869번 c#

대왕군 2024. 1. 28. 17:49

 

using System;

namespace Baekjoon
{
    internal class Program
    {
        static void Main(string[] args)
        {
            //그냥 콘솔창 예쁘게 꾸미는 코드(심심해서 넣음)
            Console.BackgroundColor = ConsoleColor.DarkCyan;

            //이 문제의 핵심은 정상에 올라간 후에는 미끄러지지 않는다는 점이다
            //즉, 낮에 A미터를 올라 나무 막대 길이인 V미터인 길이와 이때까지 오른 길이가 같거나 커진다면
            //밤이 되어 미끄러질 필요가 없다
            //즉, 정상 도착은 항상 낮에 이루어진다

            //문제의 핵심이 하나 더 있었다, 시간 제한이 있다는 점이다
            //이때문에 반복문을 쓰지말고 공식을 이용하여 시간을 줄여야 할 것 같다

            //입력값 받아옴
            string[] input = Console.ReadLine().Split();
            //각각 등반 거리 값, 미끌린 거리 값, 정상의 높이임
            int up = int.Parse(input[0]);
            int down = int.Parse(input[1]);
            int finish = int.Parse(input[2]);
            //정상까지 가는데 걸리는 일수
            int day = 0;

            //이때까지 올라간 거리(현재는 쓰지 않는 변수)
            //int totalDistance = 0;
            //반복문을 이용한 방법이지만 수가 커질수록 반복횟수도 많아져서 그만큼 느려진다
            /*while (totalDistance < finish)
            {
                day++;
                totalDistance = totalDistance + up;
                if (totalDistance >= finish)
                {
                    break;
                }
                totalDistance = totalDistance - down;
            }*/

            //일단 day변수에 값을 저장해 준다 공식은 다음과 같다
            //(정상 거리 - 등반 거리) / (등반 거리 - 미끌린 거리)
            //공식을 설명하기 전에 낮과 밤을 합친 하루 총 이동거리는 (등반 거리 - 미끌린 거리)라는 것을 알아야 한다
            //즉, 공식은 (정상 거리 - 등반 거리) / (하루 총 이동거리) 라고 보면 된다

            //(정상 거리 - 등반 거리)를 해준 이유는 (하루 총 이동거리)만으로 완등하는데 며칠이 걸리는지 알아야 하기때문이다
            //(정상 거리 - 등반 거리)는 '정상 도달 일수를 하루 빼놓는 것'과 같다(이 부분이 중요하니 잘 기억해두자)

            //만약 잘못된 공식인 (정상 거리 / 하루 총 이동거리)를 한다면 실제 소요되는 일수보다
            //잘못된 공식으로 구한 일수가 훨씬 많이 나올 것이다 ex)입력값이 100 99 1000000000일때
            //하지만 올바른 방법인 (정상 거리 - 등반 거리)에서 (하루 총 이동거리)를 나눈다면 실제 소요 일수보다 1~2 적은 일수가 나온다
            day = (finish - up) / (up - down);

            //위에서 계산한 day는 실제 소요 일수보다 1~2가 적은 일수다
            //그러므로 day에 1 또는 2를 더하여야 한다

            //(정상 거리 - 등반 거리) % (하루 총 이동거리)가 0이 아니라면 하루 더 가야한다는 뜻이다
            if ((finish - up) % (up - down) != 0)
            {
                //등반 일수 = (현재 등반일수 + 하루 더) + 아까 빼놓은 등반 일수 1
                day = (day + 1) + 1;
            }
            //(정상 거리 - 등반 거리) % (하루 총 이동거리)가 0이라면 일수가 딱맞게 떨어진다는 뜻이므로
            //아까 빼뒀던 일수 1을 더해주면 된다
            else if ((finish - up) % (up - down) == 0)
            {
                //등반 일수 = 현재 등반 일수 + 아까 빼놓은 등반 일수 1
                day = day + 1;
            }
            //결과 출력
            Console.WriteLine(day);

        }

    }
}

 

푸는데 약 한시간 정도 걸린 것 같다

공식도 이렇게 하면 되겠다 싶어서 해보다가 우연히 맞은거라 좀 아쉽다

'백준' 카테고리의 다른 글

백준 2501번 c#  (0) 2024.01.30
백준 5086번 c#  (0) 2024.01.30
백준 1193번 c#  (0) 2024.01.27
백준 2292번 c#  (0) 2024.01.27
백준 2903번 c#  (0) 2024.01.26