본문 바로가기

Algorithm/Baekjoon

1712번(손익분기점) 파이썬(Python) 풀이 공유

들어가며

처음 문제에 접근했을 때에는 while 문으로 수량을 파악하려고 하였으나, 세 번째 테스트케이스를 보고난 이후에는 생각이 완전히 바뀌었다. 세 번째 테스트케이스를 적용하는 경우 약 20억 번의 반복을 수행해야 하는데, 이럴 경우에는 문제에서 요구하는 시간 제한(0.35초)를 초과하기 때문이다. 따라서, 문제에서 요구하는 손익분기점의 의미를 먼저 파악한 다음에 규칙을 찾고, 코드를 작성하였다.

1. 문제

시간 제한 메모리 제한
0.35초 128 MB

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

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

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

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

1.1. 입력

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

1.2. 출력

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

1.3. 예제

입력 출력
1000 70 170 11
3 2 1 -1
2100000000 9 10 2100000001

2. 풀이

문제에서는 A, B, C가 공백을 기준으로 주어지는데, A는 매년 소요되는 고정비용, B는 노트북 한 대를 생산하는데 소요되는 가변비용, C는 노트북 한 대의 판매가격이다. 이 세 개의 값을 활용해서 규칙만 발견한다면 쉽게 문제를 해결할 수 있다. 문제에서 의미하는 손익분기점은 연간 노트북을 생산하는데 소요되는 총 비용보다 해당 연도의 노트북 매출액이 더 크게 발생하는 노트북 판매량을 의미한다. 주어진 예제 중 첫 번째 예제를 표로 나타내면 아래와 같다.

X : 손익분기점 A : 고정 비용 B : 생산 비용 C : 판매액 C - (A + B) : 손익
1 1,000 70 170 -900
2 1,000 140 340 -800
3 1,000 210 510 -700
4 1,000 280 680 -600
5 1,000 350 850 -500
6 1,000 420 1,020 -400
7 1,000 490 1,190 -300
8 1,000 560 1,360 -200
9 1,000 630 1,530 -100
10 1,000 700 1,700 0
11 1,000 770 1,870 100

위의 표 중에서 손익 부분을 보면, 판매 수량이 1 증가할 때마다 100원씩 증가하는 것을 확인할 수 있다. 이 정보를 토대로 간단한 식을 세워보면 아래와 같다.

노트북 1대의 판매 이익(D) : C - B

손익분기점(X) = A ÷ D + 1

즉, 노트북 1대의 판매 이익(D)의 합이 고정 비용(A)을 전부 상쇄하고 0이 아닌 양수로 전환되는 노트북 판매 수량을 찾아내면 된다. 반대로 손익분기점이 존재하지 않은 경우를 살펴보자. 노트북 1대의 판매 이익(D)이 고정 비용을 상쇄하지 못하는 경우라고 할 수 있는데, 즉, 노트북 1대의 판매 이익(D)이 0이거나 0보다 작은 경우라고 할 수 있다. 이렇게 도출한 내용을 토대로 코드를 작성하면 아래와 같다.

A, B, C = map(int, input().split(" "))
print(A // (C - B) + 1 if C - B > 0 else -1)
  • Line 1 : 입력 값을 한 줄로 입력받는데, 공백을 기준으로 나눈 리스트의 모든 요소를 수치로 변환함과 동시에 각각의 값을 A, B, C 변수에 초기화한다.
  • Line 2 : 판매 이익이 0보다 큰 경우(C - B > 0) 고정 비용(A)에서 판매 이익(D)을 나눈 몫에 1을 더한 값을 출력하고, 그렇지 않은 경우(C - B <= 0)에는 손익분기점이 존재하지 않으므로 -1을 출력한다.

마치며

문제를 풀기 전에는 반복문, 공식 등 여러 가지 생각이 꼬리를 물어 머릿속을 더욱 복잡하게 했는데, 막상 문제를 이해하고 규칙을 발견하니 쉽게 문제를 해결할 수 있었다. 놀랍게도 이 문제의 정답 비율이 25.231% 밖에 안 되는데, 아마 많은 분들이 반복문으로 접근하다가 세 번째 예제와 같이 큰 수가 입력 값으로 들어온 경우 시간 초과로 인해 오답이 되었다고 생각한다.