2021. 4. 8. 17:25ㆍFront-end/알고리즘
[백준] 1712. 손익분기점
시간 제한 | 메모리 제한 | 제출 | 정답 | 맞은 사람 | 정답 비율 |
0.35 초 | 128 MB | 103175 | 24163 | 20988 | 23.725% |
문제
월드전자는 노트북을 제조하고 판매하는 회사이다. 노트북 판매 대수에 상관없이 매년 임대료, 재산세, 보험료, 급여 등 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
내가 작성한 코드
let fs = require('fs');
let input = fs.readFileSync('/dev/stdin').toString().split(' ');
const fixedCost = Number(input[0]); // 고정 비용
const variableCost = Number(input[1]); // 가변 비용
const price = Number(input[2]); // 물건 가격
let breakEvenPoint = false; // 손익분기점
let n = 0;
if(price - variableCost <= 0){
n = -1;
}else{
n = Math.floor(fixedCost / (price - variableCost)) + 1;
}
console.log(n);
input은 띄어쓰기를 기준으로 순서대로 고정비용, 가변비용, 물건가격 을 뜻한다.
비용보다 수익이 커지는 시점(비용 < 수익)인 물건의 개수 n을 구하는 것인데,
비용 = 고정비용 + 가변비용*n
수익 = 물건가격*n 이 된다.
이 문제를 풀기 위해 핵심 포인트 2가지가 있다.
핵심 포인트 1. 손익분기점을 구할 수 없는 조건을 구해야 한다. (즉 -1을 출력해야 하는 경우)
손익분기점을 구할 수 없는 조건이란 무엇일까?
비용 < 수익이 되려면
고정비용 + 가변비용*n < 물건가격*n 이 되고, 이를 학창시절 부등식을 이용하여 풀면
(물건가격 - 가변비용)n > 고정비용
n > 고정비용 / (물건가격 - 가변비용)
이 되는데, 이 때 n은 손익분기점을 발생시킬 물건의 개수이므로 양수이어야 한다.
그러므로 즉 우항에 해당하는 부분에서 분모 인 물건가격 - 가변비용이 무조건 0보다 큰 양수여야 하는 것이다.
즉 물건가격 - 가변비용 <=0 이라면 -1을 출력하도록 하면 된다.
핵심 포인트 2. 반복문을 사용하면 안된다.
이를 n을 하나씩 증가시키면서 조건에 부합할 때 반복문을 탈출하며 n을 출력하는 방법도 있으나, 21억 이하의 자연수라면 n을 구하기 위해 반복문을 돌리는 횟수도 만만치 않을 것이다. 실제로 처음에는 반복문으로 작성했다가 시간초과가 뜨곤 했다.
그러므로 아까 위에서 정리한 부등식에서, 프로그래밍 언어로는 부등식을 단번에 풀 수 없으니 부등식말고 좌항과 우항이 같다고 생각하고 푸는 것이다.
즉, n = (고정비용 / (물건가격 - 가변비용)) + 1이라고 하는 것이다.
나누기를 했을 때에는 소수점이 나올 수 있으므로 자바스크립트의 Math.floor를 이용해서 소수점을 제거한다.
'Front-end > 알고리즘' 카테고리의 다른 글
[백준] 2839. 설탕배달 (자바스크립트/node.js/javascript/알고리즘/코딩테스트) (0) | 2021.04.10 |
---|---|
[백준] 2775. 부녀회장이 될테야 (자바스크립트/node.js/javascript/알고리즘/코딩테스트) (0) | 2021.04.09 |
[백준] 4673. 셀프 넘버 (자바스크립트/node.js/javascript/알고리즘/코딩테스트) (0) | 2021.04.04 |
[백준] 1065. 한수 (자바스크립트/node.js/javascript/배열) (0) | 2021.04.04 |
[백준] 4344. 평균은 넘겠지 (자바스크립트/node.js/javascript/배열) (0) | 2021.04.01 |