Algorithm

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

로춘남 2021. 11. 3. 22:37
728x90


https://www.acmicpc.net/problem/1712

 

1712번: 손익분기점

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

www.acmicpc.net

손익분기점을 구하는 프로그램. 손익분기점에 대해 잘 모른다면, 문제를 이해하는게 조금은 어려울 수도 있겠다싶다.

다행히 나는 회계학을 복수전공해서 쉽게 이해...

손익분기점이란 말 그대로 손익이 아는 시점이라고 보면 된다.

 

문제를 보면 변수가 주어지는데,

1. 고정 비용(불변)

2. 가변 비용

3. 상품 가격

 

1번의 경우는 몇 대를 생산하던지 변하지 않는 값이다.

즉, 문제에서 요구하는건 n 개를 생산 할때 발생하는 이익의 시점의 n이 무엇인지?

 

식으로 보면

 

n x (3. 상품가격)  > 1. 고정비용 + (n x 2.가변비용) 으로 볼 수 있다.

보기 쉽게 알파벳을 대입해보면 n x 상품가격(C) > 고정비용(A) + (n x 가변비용(B))

n x C가 곧 최종적인 수익이라 볼 수 있음. 이 값이 A + (n x B) 값을 넘어설때가 바로 손익분기점!

 

n에 대하여 식을 정리해 보면 nC > A + nB

n(C-B) > A

 

n > A / (C-B) 

단, 이 부분은 비용과 식이 같아지는 부분일뿐 이익이 나는건 아니다. 이익이 나려면 n 값에 1을 추가해주기!

다시 수식으로 해보면

n > A / ( C-B) + 1

 

어 근데 문제에서 손익분기점이 존재하지 않으면 -1을 출력하라고 한다.

이익이 발생되지 않으려면 

A / (C-B) + 1 > 0 이 이익이 발생되는 상황이니 계산된값이 0이거나 0보다 작아야 할것이다.

근데 A, B, C는 모두 자연수 값이고, 게다가 A는 변하지 않는 불변값.

 

그렇다면? C - B 가 음수가 된다면, 이익이 발생되지 않겠구나! C - B < 0 

만약 C와 B가 서로 같다면? 분모는 0이 되어서 식이 나올 수가 없을텐데?

 

여기서 약간 미분의 지식이 필요하다. C와 B가 0에 가까워 질 수록 식은 무한대에 가까워지고, 0이 되면 n 또한 무한대로 손익분익이 발생하지 않게 된다. 그렇기때문에 식을 다시 정리하자면 C - B <= 0 

C <= B가 최종적으로 구하는식이 될 수 있겠다.

import java.io.*;
import java.util.Scanner;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws IOException {

        /*Scanner sc = new Scanner(System.in);

        int A = sc.nextInt();
        int B = sc.nextInt();
        int C = sc.nextInt();

        if(C <= B) {
            System.out.println("-1");
        } else {
            System.out.println((A/(C-B)) + 1);
        }*/

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        StringTokenizer st = new StringTokenizer(br.readLine());

        int A = Integer.parseInt(st.nextToken()); //고정 비용(불변)
        int B = Integer.parseInt(st.nextToken()); //가변 비용
        int C = Integer.parseInt(st.nextToken()); //상품 비용

        if (C <= B) {
            System.out.println("-1");
        } else {
            System.out.println((A/(C-B))+1);
        }

    }
}

사실 문제의 맥락만 잘 파악했다면, 입출력 관련 어려운 문제는 아닌데,

손익분기점에 대한 개념. 그리고 미분의 개념을 사알짝 알아야 풀 수 있는 문제이지 않나싶다.

 

워밍업으로 Scanner로 풀어봤는데, Buffer의 성능이 워낙 좋으니 따로 비교는 하지 않겠음!

728x90

'Algorithm' 카테고리의 다른 글

[Java] 백준 14928번 큰 수(BIG)  (2) 2021.12.02
[Java] 백준 2420번  (0) 2021.11.04
[Java] 백준 1297번 TV 크기  (0) 2021.11.03
[Java] 백준 5554번 심부름 가는 길  (0) 2021.11.02
[Java] 백준 3046번 R2  (0) 2021.11.02