[문제]

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

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

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

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


[입력]

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


[출력] 

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

 

입력 예제 출력 예제
1000 70 170 11
1000 80 590 2
1000 150 170 501
1000 70 50 -1
1000000000 1000 1001 1000000001

 


상당히 고생했던 문제이다.

일단 문제를 제대로 이해를 하는데까지는 했다.

또한, 문제를 토대로 다음과 같은 식을 만드는 것까지 가능했다

A + B * i < C * i   // 손익분기점

 

문제는 여기서 나는 코드를 다음과 같이 만들었다.

이게 바로 문제의 코드다...

이 코드의 문제를 Stackoverflow에 질문을 한 결과, 다양한 답변 중에 가장 눈에 띈 답변은 다음과 같다.

One thing that is wrong with your code is complexity. You are doing a loop, as if you have skipped a division lesson in the elementary school. Now if the fixed cost is 1000000000, the variable cost is 1, and the price is 2, how much longer does you program runs compared to that of your friend? Another thing that is wrong with your code is that it contains multiplication, again because you have skipped a division lesson in the elementary school. Multiplying large numbers is dangerous. Try A=1000000000, B=1000 and C=1001. What does your program output? Does it look right?

사실 조금 비꼬는 어투가 있지만, 핵심은 나누기를 하지 않고 곱하기를 해서 문제가 생긴다는 것이다 (아마 이 문제는 오버플로우 일 것이라고 생각된다.)

마지막 문장에 주는 예제는...

"A=1000000000, B=1000 and C=1001" 이다.

이렇게 입력된 올바른 프로그램의 경우, 1000000001 이 올바른 답이다.

하지만, 위의 식은 이상한 답이 나온다.

 

따라서, 이 부분을 해결하여 코드를 올바르게 작성할 경우 다음과 같은 코드가 작성된다.

올바른 코드는 이렇게 해야 한다.

 

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

 

+ Recent posts