[BAEKJOON] 백준 1712: 손익분기점 (C#)

2024. 5. 8. 16:55IT/BaekJoon

문제 링크

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

 

 

문제

월드전자는 노트북을 제조하고 판매하는 회사이다. 노트북 판매 대수에 상관없이 매년 임대료, 재산세, 보험료, 급여 등 A만원의 고정 비용이 들며, 한 대의 노트북을 생산하는 데에는 재료비와 인건비 등 총 B만원의 가변 비용이 든다고 한다.

예를 들어 A=1,000, B=70이라고 하자. 이 경우 노트북을 한 대 생산하는 데는 총 1,070만원이 들며, 열 대 생산하는 데는 총 1,700만원이 든다.

노트북 가격이 C만원으로 책정되었다고 한다. 일반적으로 생산 대수를 늘려 가다 보면 어느 순간 총 수입(판매비용)이 총 비용(=고정비용+가변비용)보다 많아지게 된다. 최초로 총 수입이 총 비용보다 많아져 이익이 발생하는 지점을 손익분기점(BREAK-EVEN POINT)이라고 한다.

A, B, C가 주어졌을 때, 손익분기점을 구하는 프로그램을 작성하시오.

 

 

입력

첫째 줄에 A, B, C가 빈 칸을 사이에 두고 순서대로 주어진다. A, B, C는 21억 이하의 자연수이다.

 

 

출력

첫 번째 줄에 손익분기점 즉 최초로 이익이 발생하는 판매량을 출력한다. 손익분기점이 존재하지 않으면 -1을 출력한다.

 

 

 

통과한 답안

namespace _1712
{
    internal class Program
    {
        static void Main(string[] args)
        {
            string[] inputs = Console.ReadLine().Split(' ');
            long A = long.Parse(inputs[0]);
            long B = long.Parse(inputs[1]);
            long C = long.Parse(inputs[2]);

            if (B >= C)
            {
                Console.WriteLine(-1);
                return;
            }
            else
            {
                Console.WriteLine(A / (C - B) + 1);
            }
        }
    }
}

 

이 문제는 알고리즘 문제를 가장한 수학 문제인데,

 

우선 생산에 들어가는 비용(B)이 판매 이윤보다 같거나 크면

손익분기점이 발생하지 않으므로 이를 처리한다.

 

if (B >= C)
{
    Console.WriteLine(-1);
    return;
}

 

이후에 총 비용 expense와 이윤 even을 정의하고

while문을 이용하여 손익분기점이 발생하는 지점의 개수를 확인하면 아래와 같이 코드를 작성할 수 있다.

long cnt = 1;
long expense = A + B * cnt;
long even = C * cnt;

while (expense >= even)
{
    cnt++;
    expense = A + B * cnt;
    even = C * cnt;
}

 

이 방식이 문제를 풀이하는 방법으로 생각할 수 있지만,

예제 3번에서 나온 것처럼 숫자가 너무 크면

while문의 반복이 많아지면서 시간 초과가 발생할 수 있다.

 

따라서 이를 수학적으로 접근하여 식을 정리하면 아래와 같이 정리할 수 있다.

C * cnt > A + B * cnt
= (C - B) * cnt > A
= cnt > A / (C - B)

 

 

이때, C#에서 정수(여기서는 long이지만)의 나눗셈은 버림 효과를 가지므로 + 1을 해준다.

 

이를 통해서 위의 정답 코드가 나오게 된다.