문제
월드전자는 노트북을 제조하고 판매하는 회사이다.
노트북 판매 대수에 상관없이 매년 임대료, 재산세, 보험료, 급여 등 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을 출력한다.
예제 입력 1
1000 70 170
예제 출력 1
11
예제 입력 2
3 2 1
예제 출력 2
-1
예제 입력 3
2100000000 9 10
예제 출력 3
2100000001
#include <iostream>
using namespace std;
void breakEvenPoint(int a, int b, int c) {
int cnt = 0;
long long income = 0;
long long cost = a;
if (b >= c) {
cnt = -1;
}
else {
while (true) {
if (income > cost) break;
else {
income += c;
cost += b;
}
cnt++;
}
}
cout << cnt << endl;
}
int main() {
int a, b, c;
cin >> a >> b >> c;
breakEvenPoint(a, b, c);
return 0;
}
위의 코드가 처음에 했던 코드이다.
정말 문제 그대로를 코드로 옮겨서 풀었었다.
처음에 제출할때는 breakEvenPoint안의 변수 income, cost도 int형으로 선언하여 while문을 돌면서 int형의 범위를
넘는것을 미처 생각하지 못해 이상한 값이 나왔다.
그래서 코드를 3번정도 이리저리 바꿔보다가 깨닫고 long long으로 선언하여 했는데 시간 초과가 나왔다.
c의 printf, scanf를 안써서 그런가 싶었지만 어차피 반복문 안에 있는것도 아니고 한번씩만 사용하기 때문에
아닌 것 같아서 반복문에 문제가 있나 싶었다.
하지만 챕터 이름이 기본수학1인 만큼 수학적 사고력이 필요했다.
만약 가변비용(b)이 파는가격(c)보다 크다고 하면 절대 따라잡지 못해 손익분기점이 없어 -1을 출력하면 된다.
여기까진 처음에 떠올렸다.
하지만 조금만 더 생각해보니, 반복문을 쓰지않고 수식으로 간단하게 나타낼 수 있었다.
#include <iostream>
using namespace std;
void breakEvenPoint(int a, int b, int c) {
int cnt;
if (b >= c) {
cnt = -1;
}
else {
cnt = a / (c - b);
cnt++;
}
cout << cnt << endl;
}
int main() {
int a, b, c;
cin >> a >> b >> c;
breakEvenPoint(a, b, c);
return 0;
}
n개 총 수입(판매비용) = n * c
n개 총 비용(고정비용 + 판매비용) = a + n * b
수입 > 비용 => nc > a + nb
nb를 좌항으로 이항하면, nc - nb > a => n(c - b) > a
n > a / (c - b) 이라는 식이 완성된다.
그리고 위에 (b >= c) 라는 조건이 있는데, (c - b <= 0)과 같다.
따라서 우리는 결국 저 부등식(?)을 c - b가 음수일때와 양수일때를 나눠서 값을 구해주는 것 뿐이다.
이 문제를 풀면서 수학적 사고력을 높여야 코드도 단순해지고, 훨씬 쉽고 빠르게 할 수 있다는 것을 느꼈다.
'PS > 백준' 카테고리의 다른 글
백준 / 문자열 / 1316번 / 그룹 단어 체커 / C++ (0) | 2021.07.14 |
---|---|
백준 / 기본 수학 1 / 2292번 / 벌집 / C++ (0) | 2021.07.14 |
백준 / String(문자열) / 10988번 / 팰린드롬인지 확인하기 / C (0) | 2021.02.27 |
백준 / String(문자열) / 11365번 / !밀비 급일 / C (0) | 2021.02.27 |