티스토리 뷰
문제.
월드 전자는 노트북을 제조하고 판매하는 회사이다. 노트북 판매 대수에 상관없이 매년 임대료, 재산세, 보험료, 급여 등 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을 출력한다.
방법.
먼저 손익분기점이 존재하지 않는 경우를 추론해보았다. cn < a + bn 공식이 성립하는 경우 n이 손익 분기점을 위해 판매되어야 하는 노트북의 최소 개수이다. 그렇다면 손익분기점이 발생하지 않을 때에는 판매 개수가 의미 없으므로, n을 사용하지 않는 공식이 필요하다. 아래와 같이 추론할 수 있다.
cn < a + bn
cn-bn < a
n(c-b) < a
c-b < a/n
a와 n은 항상 양수이므로, a/n 연산의 결과도 항상 양수이다. 즉, c-b의 값이 음수라면 손익분기점이 발생하지 않는다는 것을 알 수 있다. c-b 가 음수가 되려면 c<b 가 되어야 하므로, 손익분기점이 발생하지 않는 if문의 조건은 c<b 이 된다.
먼저 손익분기점이 발생하지 않는 경우를 if문으로 걸러내고, else문 내부에서 while문을 사용해 노트북 개수를 의미하는 n을 1씩 증가하며 손익분기점이 넘는 지점을 찾아보았다. 테스트 케이스의 결과와 동일하게 나왔으나, 제출하니 시간 초과가 나왔다.
#include <stdio.h>
//시간 초과
int main(void){
int a, b, c;
int n = 0;
scanf("%d %d %d", &a, &b, &c);
if(c<b){
n=-1;
printf("%d\n",n);
}else{
while(n>=0){
n++;
if(c*n-(a+(b*n))>0){
printf("%d\n",n);
break;
}
}
}
return 0;
}
그래서 손익분기점이 없는 경우의 조건을 찾을 때와 마찬가지로, n을 찾는 조건에 변화를 주었다.
cn < a + bn
cn-bn < a
n(c-b) < a
n < a/(c-b)
손익 분기점을 넘어 이익이 발생하는 지점을 구해야 하므로, 위 공식에 +1을 해야 이익이 발생하는 최소 판매 개수를 알 수 있다. 위 공식을 사용해 수정한 코드는 아래와 같다. 제출하니 시간 초과 없이 정답 처리되었다.
#include <stdio.h>
int main(void){
int a, b, c;
scanf("%d %d %d", &a, &b, &c);
if(c<=b){
printf("-1\n");
}else{
int num = a/(c-b);
printf("%d\n",num+1);
}
return 0;
}
'Computer Science > 백준 알고리즘' 카테고리의 다른 글
[백준.02577-Python] 숫자의 개수 (0) | 2021.03.17 |
---|---|
[백준.02292-C언어] 벌집 (0) | 2021.03.15 |
[백준.01316-C언어] 그룹 단어 체커 (0) | 2021.03.14 |
[백준.02941-C언어] 크로아티아 알파벳 (0) | 2021.03.12 |
[백준.05622-C언어] 다이얼 (0) | 2021.03.11 |