월드전자는 노트북을 제조하고 판매하는 회사이다. 노트북 판매 대수에 상관없이 매년 임대료, 재산세, 보험료, 급여 등 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을 출력한다.
var fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "test.txt";
let input = fs.readFileSync(filePath).toString().trim().split(" ");
const a = parseInt(input[0]);
const b = parseInt(input[1]);
const c = parseInt(input[2]);
let cnt = 1;
while (a + b * cnt > c * cnt) {
a + b * cnt > c * cnt ? (cnt += 1) : (cnt += 0);
if (cnt > a) {
cnt = -1;
break;
}
}
console.log(cnt === -1 ? -1 : cnt + 1);
while문을 사용하니까 정답은 나오지만 시간 초과라는 문제가 생겼다. 해당 문제는 시간 제한이 있었고, 최대 수인 21억까지 계산을 하게 된다면 당연히 while문으로는 시간 초과가 나올 것인데 도저히 어떻게 풀어야 될지 생각이 나지 않아서 다른 사람들의 풀이를 보았다.
백준 사이트에서 수학적으로 풀이를 잘해 준 질문이 있길래 참고해서 풀었던 두 번째 풀이.
var fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "test.txt";
let input = fs.readFileSync(filePath).toString().trim().split(" ");
const a = parseInt(input[0]);
const b = parseInt(input[1]);
const c = parseInt(input[2]);
if (c - b <= 0) console.log(-1);
else console.log(a / (c - b) + 1);
해당 풀이는 a + (b * cnt) < c * cnt
식을 활용하여서 최종적으로 (a / (c - b)) < n
에서 우리가 원하는 답인 (a / (c - b)) + 1
을 활용한 식을 제시해 주었다. 그런데 이렇게 제출을 해도 틀렸다는 결과가 나왔고... 대체 뭐가 문제일까 싶어 다른 풀이들을 보던 중 최종적으로 정답을 제출할 수 있었다.
var fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "test.txt";
let input = fs.readFileSync(filePath).toString().trim().split(" ");
const a = parseInt(input[0]);
const b = parseInt(input[1]);
const c = parseInt(input[2]);
const margin = c - b;
const count = Math.floor(a / margin) + 1;
console.log(margin <= 0 ? -1 : count);
식으로 보면 두 번째에 제출한 것과 별반 다를 게 없다. 그러나 Math.floor
를 사용해서 소수를 처리해 주니 정답이 되었다! 이런 사소한 부분까지 확인하는 게 어려운 것 같다.