백준 1712번 : 손익분기점을 넘기자

mickey·2021년 3월 3일
0

서론


본인은 컴퓨터공학과지만 수학을 더럽게 못한다.

그저 컴공이라면 코드만 어떻게 해내면 된다고 얄팍하게 생각해왔다..

그러나 점점 취직준비와 코드를 짜게 될 수록 효율적인 코드를 짜려면 수학적 지식이 기초가 되어야 함을 느끼고 있다...

그래서 알고리즘 문제를 풀 수 있는 백준에서 간단한 문제들을 풀어가며 수학적 소양을 넓혀보기로 마음을 먹었다.

이 문제를 풀기 위해서 본인은 엄청 애를 먹었는데.. 이 글을 수포자이지만 개발자를 지망하는 사람들을 위해 작성하겠다.

각설하고 문제를 보도록 하자.

문제

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

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

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

단, 손익분기점이 존재하지 않는 경우에는 -1을 출력한다.

문제만 봤는데도 벌써 아찔하다. 문제에서 눈이 팅겨나간다면 굵은 글씨만 확인하면 된다.

결국 어떤 노트북 회사가 얼마나 노트북을 팔아야 망하지 않을까? 라고 간단하게 요약할 수 있다.

수식 세우기

위 노트북 회사를 위하여 특별히 프로그램을 만들어 주는 것으로 하자.

원래 선심쓰듯 해야 좀 있어 보인다고 생각한다.

일단 식은 다음과 같이 세울 수 있다.

A(노트북과 상관없이 고정으로 나가는 비용) + B(노트북 만드는 재료비, 인건비) x 노트북 갯수 < C(노트북 가격) x 노트북 갯수

이렇게 수식을 세운 이유는 저 노트북 회사가 노트북을 만들면서 살려면 노트북을 만들 공간, 판매할 공간과 같은 비용(고정비용)과 노트북을 생산하는데 드는 비용(몇대를 만드냐에 따라 바뀌는 가변 비용) 이상을 판매해야 직원들 월급도 주고 나도 먹고 살 수 있기 때문이다.

그럼 노트북의 갯수를 N 이라고 바꾸어 깔끔하게 식을 변경해보자.

A + BN < CN

위와 같은 식이 완성되었다. 그런데 뭔가 같은 문자를 보면 같은 문자끼리 묶고 싶어지지 않는가?

그렇지 않더라도 한번 묶어서 식을 만들어보자.

A < (C-B)N

다음과 같이 완성되었다. 그러나 수학을 좋아하는 사람들은 여기서 멈추지 않는다. 그 사람들은 우리에게 다음과 같이 말할 것이다.

N 앞에 있는 수식을 왼쪽으로 넘겨버리면 노트북을 몇대를 만들어야 하는지 계산하기 쉬울 것 같은데?

N > A/(C-B)

드디어 노트북을 최소 몇대를 팔아야 망하지 않는지 공식이 만들어졌다.

회사를 유지하기 위한 고정비용(임대료, 보험료 등등)노트북을 판매하기로 정한 금액에서 생산비용을 뺀 만큼 을 나눈거보다 많이 만들어야 한댄다.

이게 뭔 개소리일까?

저 문자들을 해석을 해서 개소리가 되었지만 포인트는 몇 대를 팔아야 우리 직원들 월급도 주고 나도 먹고 살까? 이다.

노트북 회사 사장님의 마음이 이해가 되었다면 위 수식을 한번 코드로 변경해보자.

프로그램 만들기

# python 에서는 사용자의 값을 받기 위해 input() 함수를 지원합니다.
# 그러나 그 속도가 답답하게 느껴질때 sys.stdin 안에 있는 readline() 이라는 함수를 사용하기 위해서 작성한 구문입니다.
import sys
# 소숫점 이하는 버리기 위해서 작성한 import 구문입니다.
import math


# readline() 함수를 사용하게 되면 한 줄을 읽어오기 때문에 줄바꿈 문자(\n) 이 포함되기 때문에 
#그 문자를 제거하고 사용자가 입력한 값을 구분하기 위해 숫자마자 띄어쓰기가 들어가므로 띄어쓰기를 제외한
# 사용자에게 입력받은 값을 숫자(int) 로 바꾸기 위해 아래와 같이 작성하였습니다.
a,b,c = map(int, sys.stdin.readline().rstrip('\n').split())

# 위에서 세운 수식 a/(b-c) 는 노트북의 갯수이므로 판매할 노트북이 0대면 안됩니다.
# 그 말인 즉슨, 분자인 b-c 는 항상 0보다 커야 한다는 의미입니다.
if b >= c:
    print(-1)
# 나누기를 하면 보통 소숫점이 생깁니다. 노트북 0.5대는 이세상에 존재하지 않으므로
# 소숫점은 과감하게 싹 다 쳐내고, 손익 분기점을 넘겨야 직원 월급을 주므로 +1을 하였습니다.
else:
    print(math.floor(a/(c-b)) +1)

결론


우리는 노트북 회사 사장님이 노트북을 몇 대를 팔아야 직원들 월급을 줄 수 있는지 문제를 해결해버렸다.
노트북 회사 사장님이 이 글을 보고 구현한 능력있는 글쓴이와 독자들에게도 그 월급을 주길 기대해보자.

profile
Hello

0개의 댓글