[백준] 1712번 : 손익분기점

업데이트:

문제

월드전자는 노트북을 제조하고 판매하는 회사이다. 노트북 판매 대수에 상관없이 매년 임대료, 재산세, 보험료, 급여 등 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

2100000000 9 10

예제 출력 2

2100000001

풀이1

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>

int main() {
	
	double A = 0, B = 0, C = 0;
	int N = 0;
	double temp = 0;

	scanf("%lf %lf %lf", &A, &B, &C);
	temp = A / (C - B);

	while (1) { 
		if (C - B <= 0) {
			printf("-1\n");
			break;
		}

		if (N >temp) {
			printf("%d\n", N);
			break;
		}

		N++;
	}
}

알고리즘 [ 접근방법 ]

문제를 보자마자 떠오른 풀이 방법은 while문을 활용해야겠다는 생각이였다. 손익분기점을 넘길 때 까지 while문을 반복한다면 N값을 쉽게 찾을 수 있을것이라 생각했고 실제로 올바른 결과가 출력되었다. 그러나 한가지 간과한 사실이 있었다.

enter image description here

해당 문제는 시간 제한이 일반적인 문제보다 적은 0.35초였고 while문을 사용한다면 시간 초과라는 결과가 도출되었다.

enter image description here

    while (1) { 
    	if (C - B <= 0) {
    		printf("-1\n");
    		break;
    	}
    
    	if (N >temp) {
    		printf("%d\n", N);
    		break;
    	}
    
    	N++;
    }

위의 코드에서 A=210,000,000 / B=9 / C=10 이라고 주어진다면 while문이 21억번 실행되므로 시간초과라는 결과가 나타나는 것이다. 따라서 이를 해결하기 위해서는 반복문을 사용하는것 보다는 단순 부등식을 이용해 연산하는 편이 좋다.

풀이2

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>

int main() {

	double A = 0, B = 0, C = 0;
	int N = 0;
	double temp = 0;
	int res = 0;

	scanf("%lf %lf %lf", &A, &B, &C);
	temp = A / (C - B);

	if (C - B <= 0) { // 손익분기점이 존재하지 않는 경우
		printf("-1\n");
		exit(0);
	}

	res = temp + 1; // 손익분기점 계산

	printf("%d", res);
}

알고리즘 [ 접근방법 ]

먼저 손익분기점을 계산한 값을 temp에 입력해준뒤에 이에 +1을 해주는 방식을 선택하면 런타임을 훨씬 단축시켜 문제의 정답과 부합하게 만들 수 있다.

댓글남기기