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

uHan2·2020년 3월 11일
5

TIL.Algorithm

목록 보기
2/12

안녕하세요.
지금까지 계속 저만의 기술 블로그를 만들어야지, 만들거야
마음으로만 다짐하다가 인제야 시작하게 되었습니다.
비록 시작은 코딩일기지만, 그 끝은 창대하게
어엿한 개발자 블로그로 성장할 수 있도록 노력하겠습니다.


Prologue

제 첫 일기로 전에 풀어봤던 "백준" 알고리즘 문제 중에 하나를 가져와봤습니다.

백준 1712번 손익분기점

문제는 조금 길지만 한번 읽어보면 이해하기 어려운 수준은 아닙니다.

요약하자면,
초기비용(고정비용)과 원가(가변비용)를 입력한 판매가격으로 판매한다면
몇 대를 팔았을 때 손익분기점이 발생하는가를 묻는 문제입니다.

그런데도 정답률은 약 24%로 생각보다 아주 낮은 문제입니다.
(아마 0.35초 시간제한 때문에 그렇겠죠…? 진짜 정말 싫다.)


PseudoCode

처음 문제를 봤을 때 들었던 생각은

1. 고정비용, 가변비용, 판매비용 입력받기.

2. (판매비용) * (판매한 수) > (고정비용) + (가변비용 * 판매한 수)

3. 판매한 수를 1씩 증가.

4. 해당 조건을 만족하면 판매한 수 출력.

이었으나 ...

망할 시간제한 때문에 반복문을 쓰면 시간초과가 됩니다...
그래서 사고의 방식을 바꿔야 할 필요가 있었죠.

판매한 수익이 생산한 비용을 넘는 게 아니라, 그 반대로
판매에서 발생한 이윤으로 고정비용을 상쇄하자
라고 생각해봤습니다.

어차피 많이 팔아서 이윤을 남기나
반대로 판매가에서 원가를 뺀 이윤을 고정비용에서 빼면서 없애나 그 순간부터
손익분기점이 되는 것이기 때문이죠.

다르게 말하자면,

(판매비용) * (판매한 수) > (고정비용) + (가변비용 * 판매한 수)

여기에서 (가변비용 * 판매한 수) 를 좌변으로 이항한다는 느낌으로 이해하시면 될 것 같습니다.

판매할 가격에서 원가를 뺀 이윤으로 고정비용을 제거하면 되니까요!

그리고 문제에서 손익분기점이 존재하지 않는
말도 안 되는 사업의 경우 -1 의 출력을 요구하고 있습니다.
이런 경우에는 이윤이 없는 즉, 판매가격이 가변비용을 넘지 못하는
경우이기 때문에 간단하게 조건문을 추가해서 해결하였습니다.


SourceCode

import java.io.*;
import java.util.*;

public class Main
{
    public static void main(String[] args) throws IOException
    {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer str = new StringTokenizer(br.readLine());
        
        int goJeongPay = Integer.parseInt(str.nextToken());
        int gaByeonPay = Integer.parseInt(str.nextToken());
        int price = Integer.parseInt(str.nextToken());
        
        if(price <= gaByeonPay)
        {
            System.out.print("-1");    
        }
        else
        {
            System.out.print((goJeongPay / (price - gaByeonPay)) + 1);
        }
    }
}

코드를 오픈한다는건 언제나 부끄럽네요...
(혹시나 여유가 있으시다면 코드리뷰 부탁드립니다!)
첫 일기인 만큼 가볍게 시작하기 위해서 가져온 문제라
사실 코드는 아주 짧습니다.

가볍게 훑어보자면,

int goJeongPay = Integer.parseInt(str.nextToken());
int gaByeonPay = Integer.parseInt(str.nextToken());
int price = Integer.parseInt(str.nextToken());

여기에서 BufferedReader를 이용하여
고정비용, 가변비용, 판매가격을 각각 입력받습니다.

if(price <= gaByeonPay)
{
	System.out.print("-1");    
}
else
{
	System.out.print((goJeongPay / (price - gaByeonPay)) + 1);
}
  1. 우선 판매가격이 가변비용을 넘지 못하여 수익분기점이 발생하지 않으면
    -1 을 출력하게 됩니다.

  2. 손익분기점이 발생하는 경우 판매가격에서 생산비용을 뺀 이윤으로
    고정비용을 나눠 판매한 수를 구하였습니다.
    마지막에 +1 을 한 이유는 손익분기점이 되기 위해서는
    고정비용을 넘어서야 하니까 하나를 더 팔아야 하기 때문이죠.


Epilogue

코딩일기를 작성해보니 확실히 제가 생각했던 사고 흐름을
다시 정리해볼 수 있어서 좋네요.
일주일에 하나씩이라도 꾸준히 올릴 수 있도록 하겠습니다.
코딩도 블로그도 계속해서 발전하도록 노력하겠습니다.

코드에 대한 조언은 언제나 환영이며, 오히려 부탁드리겠습니다.

profile
For the 1% inspiration.

6개의 댓글

comment-user-thumbnail
2020년 3월 11일

무슨 말인지 1도 모르지만 화이팅하세요!

1개의 답글
comment-user-thumbnail
2020년 3월 11일

BufferedReader!!!! man..

1개의 답글
comment-user-thumbnail
2020년 3월 11일

왕십리농구인이 보고 간다

1개의 답글