2024. 5. 8. 16:55ㆍIT/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을 해준다.
이를 통해서 위의 정답 코드가 나오게 된다.
'IT > BaekJoon' 카테고리의 다른 글
[BAEKJOON] 백준 1773: 폭죽쇼 (C#) (0) | 2024.05.10 |
---|---|
[BAEKJOON] 백준 3028: 창영마을 (C#) (0) | 2024.05.10 |
[BAEKJOON] 백준 1668: 트로피 진열(C#) (0) | 2024.05.08 |
[BAEKJOON] 백준 1592: 영식이와 친구들(C#) (0) | 2024.05.08 |
[BAEKJOON] 백준 1568: 새(C#) (0) | 2024.05.08 |