본문 바로가기
Study (etc)/Problem Solving

[BOJ/C] 1712번 : 손익분기점

by Haren 2022. 1. 27.

햇수로 치면 3년만의 BOJ 포스팅이다.

그동안 무기력증에 빠져 자기계발이든 뭐든 소홀히 했었는데, 이제서라도 뭔가 해보자고 자리에 앉았다.

아무튼, 이번에 풀어본 문제는 아마 내가 처음 풀어보는 수학적 문제가 아닌가 싶다.

 

문제

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


 

문제 풀이 메모

이 문제는 고정 비용인 A만원, 가변 비용인 B만원, 그리고 노트북 판매 금액의 C만원으로 최초로 총 수입이 총 비용보다 많아져 이익이 발생하는 지점을 찾는 문제다.

 

A, B, C 세 비용의 관계는 간단하게 일차부등식으로 나타낼 수 있다.

 

나는 처음에 이 식에 대해 while(1)으로 무한 반복을 돌려 x값을 1부터 ...n까지 무한대입해서 구할 생각을 했었는데, 문제의 조건에 시간제한 0.35초가 걸려있었고, 이는 브루투포스로는 만족시킬 수가 없었다. 다른 방법을 생각해야 했다.

 

그리고 위의 식을 x로 정리해서 간단하게 바라보기로 했다. 각 변을 정리해주면 다음과 같이 나타낼 수 있다.

x는 우리가 구해야 할 손익분기점 즉, 최초로 이익이 발생하는 판매량이다.

A는 고정 비용이기 때문에 우선 생략하고 생각해도 된다고 생각했다.

어쨌든 판매량과는 상관 없이 나가는 비용이기 때문이다.

따라서 C-B의 값이 x보다 작아야 한다는 결론에 다다른다. 이는 반복문 사용 없이 간단히 해결이 가능하다는 것을 생각할 수 있었다.

 

C - B < 0 을 만족시키려면 C는 무조건 B보다 큰 수여야 한다. 같거나 작아서는 안된다.

그리고 손익분기점을 도출해내려면 <는 미만이기에 x값을 찾는다고 한들 처음 이익이 발생되는 지점은 아니다.

A / (C - B) 의 값에 +1을 해주면 끝나는 문제였다. 

 

코드

#include <stdio.h>

int main() {
    int a, b, c;

    scanf("%d %d %d", &a,&b,&c);

    if(c<=b)
        printf("-1\n");
    else
        printf("%d",a/(c-b)+1);
    
    return 0;
}

 

 결과

 

소감

처음에는 이렇게 간단히 풀릴 문제인지도 모르고 순차적 대입이니 뭐니 빙빙 돌고 돌다가 문제를 수식으로 나타내면서 갈피가 점점 잡혔다.

구글링 없이 풀어보려고 애썼고, 다 풀고보니 다른 분들의 코드도 나와 비슷하거나 혹은 같았다. 확실히 '정답'이 있는 문제 같았다.

스스로도 다시 의욕이 생겼고, solved.ac를 통해 티어를 올려가며 성취감을 느껴볼 생각이다.