프로그래밍/C, C++

[C]백준 1712 손익분기점

pxatd 2021. 1. 18. 01:36
728x90

문제

월드전자는 노트북을 제조하고 판매하는 회사이다. 노트북 판매 대수에 상관없이 매년 임대료, 재산세, 보험료, 급여 등 A만원의 고정 비용이 들며, 한 대의 노트북을 생산하는 데에는 재료비와 인건비 등 총 B만원의 가변 비용이 든다고 한다.

예를 들어 A=1,000, B=70이라고 하자. 이 경우 노트북을 한 대 생산하는 데는 총 1,070만원이 들며, 열 대 생산하는 데는 총 1,700만원이 든다.

노트북 가격이 C만원으로 책정되었다고 한다. 일반적으로 생산 대수를 늘려 가다 보면 어느 순간 총 수입(판매비용)이 총 비용(=고정비용+가변비용)보다 많아지게 된다. 최초로 총 수입이 총 비용보다 많아져 이익이 발생하는 지점을 손익분기점(BREAK-EVEN POINT)이라고 한다.

A, B, C가 주어졌을 때, 손익분기점을 구하는 프로그램을 작성하시오.

 

학습

처음 작성한 코드이다. 고정비용, 가변비용, 물건가격과 총수입, 손익분기점, 판매개수를 전부 변수로 지정해놓고 for 반복문으로 손익분기점이 되는 순간을 알아내려 하였다. 그러나 int 자료형에서 오버플로우가 발생하기도 했고, 문제의 조건인 21억번 반복을 하니 시간초과 에러가 발생했다. 문제의 의도를 파악하지 못한것이라 생각하고, 다시 처음부터 수학적 규칙을 찾기로 하였다. 

 

코드 1 (틀린 코드)

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main()
{
	int a, b, c; // a=고정비용 b=인건비(가변비용) c=물건가격
	int x, y; //x=총 수입 y=손익분기점
	int n; //n=판매개수
	scanf_s("%d %d %d", &a, &b, &c);
	
	if (c <= b) 
	{
		printf("-1\n");
	}
	else
	{
		for (n = 1; n < 2100000000; n++) // int 자료형이 양수 21억까지 
		{
			x = a + (b * n);
			y = n * c;
			printf("x=%d\n", x);
			printf("y=%d\n", y);
			if (x == n * c || x < n * c)
			{
				break;
			}
		}
		printf("n= %d", n + 1);
	}

	return 0;
}

그 결과 간단하게 a/(c-b)+1이라는 수식으로 손익분기점을 구할 수 있었다. 

코드2 (정답 코드)

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main()
{
	int a, b, c; // a=고정비용 b=인건비(가변비용) c=물건가격

	scanf("%d %d %d", &a, &b, &c);
	
	if (c <= b) 
	{
		printf("-1\n");
	}
	else
	{
		printf("%d\n", a / (c - b) + 1);
	}
	return 0;
}
문제출처

www.acmicpc.net/problem/1712

 

1712번: 손익분기점

월드전자는 노트북을 제조하고 판매하는 회사이다. 노트북 판매 대수에 상관없이 매년 임대료, 재산세, 보험료, 급여 등 A만원의 고정 비용이 들며, 한 대의 노트북을 생산하는 데에는 재료비와

www.acmicpc.net

 

728x90