문제
월드전자는 노트북을 제조하고 판매하는 회사이다. 노트북 판매 대수에 상관없이 매년 임대료, 재산세, 보험료, 급여 등 A만원의 고정 비용이 들며, 한 대의 노트북을 생산하는 데에는 재료비와 인건비 등 총 B만원의 가변 비용이 든다고 한다.
예를 들어 A=1,000, B=70이라고 하자. 이 경우 노트북을 한 대 생산하는 데는 총 1,070만원이 들며, 열 대 생산하는 데는 총 1,700만원이 든다.
노트북 가격이 C만원으로 책정되었다고 한다. 일반적으로 생산 대수를 늘려 가다 보면 어느 순간 총 수입(판매비용)이 총 비용(=고정비용+가변비용)보다 많아지게 된다. 최초로 총 수입이 총 비용보다 많아져 이익이 발생하는 지점을 손익분기점(BREAK-EVEN POINT)이라고 한다.
A, B, C가 주어졌을 때, 손익분기점을 구하는 프로그램을 작성하시오.
시간제한 : 0.35초
예제 입력 1
2100000000 9 10
예제 출력 1
2100000001
예제 입력 2
3 2 1
예제 출력 2
-1
문제 해석
A : 초기 투자 비용
B : 생산 비용
C : 판매 가격
이 문제는 시간제한이 존재한다. 또한 카테고리가 수학이므로, 수학적으로 접근해서 계산을 해야한다.
기존대로 판매 대수를 반복문을 돌며 증가시켜가면 시간제한에 걸리게 될 것이다.
일반적으로 식을 계산하여 반복문을 돌면서 판매대수를 증가시켜 총 수익 > 총 비용 인 지점을 찾게 되면
예제의 입력과 같이 2,100,000,000 (21억) 의 입력값이 들어오게 되면
int 형이 표현할 수 있는 범위를 벗어나게 될 것이다.
그것을 해결하기 위해 int 형을 long long int 등의 타입으로 선언할 시에 메모리 범위가 커져 시간제한에 걸릴 것이다.
따라서, 이 문제는 반복문을 전.혀 사용하지 않고 풀어야만 한다.
여기까지만 읽고 힌트를 얻었다면 혼자 풀어보고, 정 모르겠으면 풀이를 본다.
풀이
#include <iostream>
using namespace std;
int main()
{
int fixed; // 고정 비용
int flexible; // 생산 비용
int price; // 판매 가격
cin >> fixed >> flexible >> price; // 입력받기
if (flexible >= price) // 비용이 판매가격 보다 크다면
{
cout << -1; // 손익분기점 없음
return 0;
}
else cout << fixed / (price - flexible) + 1; // 고정 투자비용 / 판매 1회당 이익 = 판매 대수
}
우선, 손익분기점이 존재하지 않으려면 생산비용이 판매가격보다 비싸면 된다.
if (flexible >= price) // 비용이 판매가격 보다 크다면
{
cout << -1; // 손익분기점 없음
return 0;
}
그리고, 반복문을 사용하지 않고 판매 대수를 구하기 위해선 다음과 같이 할 수 있다.
fixed / (price - flexible) + 1;
고정비용이 예를 들어 1000만원이 들어갔다고 가정하자.
상품의 가격은 170만원이고, 상품 하나를 생산할 때 70만원의 비용이 든다고 가정한다.
그렇다면 상품 하나를 팔아 얻는 이득은 100만원이다.
처음 고정비용 1000만원은 지출이므로 1개 당 이득 X 판매 수량 이 1000만원이 되면,
처음 지출한 1000만원을 딱 갚는 시점, 즉 0 원의 총 이익이 된다.
식으로 표현하면 [1000 = 100 * 판매수량] 이 된다.
바꿔서 생각하면 [1000 / 100 = 판매수량] 이 된다.
다시 말해, [고정비용 / 1개당 이익 = "손익분기점의 직전 판매 수량"] 이 된다.
이 "손익분기점의 직전 판매 수량" 에 + 1을 하게 되면 "손익분기점이 시작되는 판매 수량" 이 된다.
이를 통해 반복문의 사용없이 수학적 접근을 통해 빠른 계산이 가능하다.
'백준 알고리즘 단계별 풀이 (문제 수) > 기본 수학 1 (8)' 카테고리의 다른 글
[C++] 부녀회장이 될테야 : 2775번 (0) | 2022.07.04 |
---|---|
[C++] ACM 호텔 : 10250번 (0) | 2022.07.04 |
[C++] 달팽이는 올라가고 싶다 : 2869번 (0) | 2022.07.04 |
[C++] 분수 찾기 : 1193번 (0) | 2022.07.04 |
[C++] 벌집 : 2292번 (0) | 2022.07.04 |