본문 바로가기

코딩/백준 BOJ

[백준/C언어] 1712번 - 손익분기점

백준 웹사이트 "1712번 - 손익분기점" 문제풀이입니다.

언어는 C언어입니다. (제출 언어: C99)

 


문제

 

1712번: 손익분기점

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

www.acmicpc.net


소스 코드

#include <stdio.h>

int main(void){
    int A, B, C; //32비트 부호 정수형 최댓값: 2,147,483,647
    scanf("%d %d %d", &A, &B, &C);

    if(B>=C){
        printf("-1\n"); //손익분기점 존재 X
    }
    else{
        //C>B 이므로, C-B>0
        int n = A/(C-B);
        printf("%d\n", n+1); //'이득'을 보려면 1 추가
    }
}

문제 풀이

  입력되는 A, B, C는 '21억 이하의 자연수'라는 조건이 있습니다. 대중적인 32비트 운영체제에서, 정수(int) 자료형의 최댓값은 2,147,483,647입니다. 이 값은 2^31-1로, '부호'를 상징하는 첫 자리를 제외한 31비트가 모두 1일 경우입니다. 여하튼 21억 이하의 자연수인 A, B, C는 반드시 int의 최댓값보다 작기 때문에 Line 4에서 세 자연수를 int형으로 선언을 해도 overflow가 일어날 위험이 없습니다.

  Line 7 ~ 14은 손익분기점을 구하는 과정입니다. 만약 가변비용(B)가 가격(C)와 같거나 더 크다면, 판매량이 아무리 늘어도 이익이 발생할 수 없기 때문에, '-1'이 출력되도록 합니다. 반면에 C>B가 성립한다면, 언젠가는 분명 이익이 발생하게 됩니다. 이익이 발생하는 판매량은 A/(C-B)로 쉽게 구할 수 있습니다. Line 11의 else문은 C>B일 경우에만 실행되므로, Line 12에서 C-B>0으로 분모가 0이 될 위험은 없습니다.

  이 문제에서는 손익분기점을 '최초로 이익이 발생하는 판매량'으로 정의합니다. '총 비용과 총 소득이 동등한 지점'이라는 사전적 의미와 다르기 때문에 문제를 풀 때 주의해야 합니다. Line 12의 수식으로 구한 n은 손익분기점에 도달하기 직전의 값입니다. 따라서 이를 1만큼 증가시킨 값이 손익분기점이 됩니다.

  풀이 방법은 다양하며, while문과 같은 반복문을 이용할 수도 있습니다. 하지만 반복문을 이용할 경우, 21억을 넣었을 때 반복문이 21억 번 실행됩니다. 결과적으로 시간 제한 0.35초 안에 해결되지 못하면서, '시간 초과'가 뜨게 됩니다. 따라서 이 문제는 반복문을 이용하여 올바른 코드를 작성할 수는 있어도, 이용하지 않고 풀어야 '맞았습니다!!'를 볼 수 있습니다.

반응형