안녕하세요.
지금까지 계속 저만의 기술 블로그를 만들어야지, 만들거야
마음으로만 다짐하다가 인제야 시작하게 되었습니다.
비록 시작은 코딩일기지만, 그 끝은 창대하게
어엿한 개발자 블로그로 성장할 수 있도록 노력하겠습니다.
제 첫 일기로 전에 풀어봤던 "백준" 알고리즘 문제 중에 하나를 가져와봤습니다.
문제는 조금 길지만 한번 읽어보면 이해하기 어려운 수준은 아닙니다.
요약하자면,
초기비용(고정비용)과 원가(가변비용)를 입력한 판매가격으로 판매한다면
몇 대를 팔았을 때 손익분기점이 발생하는가를 묻는 문제입니다.
그런데도 정답률은 약 24%로 생각보다 아주 낮은 문제입니다.
(아마 0.35초 시간제한 때문에 그렇겠죠…? 진짜 정말 싫다.)
처음 문제를 봤을 때 들었던 생각은
1. 고정비용, 가변비용, 판매비용 입력받기.
2. (판매비용) * (판매한 수) > (고정비용) + (가변비용 * 판매한 수)
3. 판매한 수를 1씩 증가.
4. 해당 조건을 만족하면 판매한 수 출력.
이었으나 ...
망할 시간제한 때문에 반복문을 쓰면 시간초과가 됩니다...
그래서 사고의 방식을 바꿔야 할 필요가 있었죠.
판매한 수익이 생산한 비용을 넘는 게 아니라, 그 반대로
판매에서 발생한 이윤으로 고정비용을 상쇄하자
라고 생각해봤습니다.
어차피 많이 팔아서 이윤을 남기나
반대로 판매가에서 원가를 뺀 이윤을 고정비용에서 빼면서 없애나 그 순간부터
손익분기점이 되는 것이기 때문이죠.
다르게 말하자면,
(판매비용) * (판매한 수) > (고정비용) + (가변비용 * 판매한 수)
여기에서 (가변비용 * 판매한 수) 를 좌변으로 이항한다는 느낌으로 이해하시면 될 것 같습니다.
판매할 가격에서 원가를 뺀 이윤으로 고정비용을 제거하면 되니까요!
그리고 문제에서 손익분기점이 존재하지 않는
말도 안 되는 사업의 경우 -1 의 출력을 요구하고 있습니다.
이런 경우에는 이윤이 없는 즉, 판매가격이 가변비용을 넘지 못하는
경우이기 때문에 간단하게 조건문을 추가해서 해결하였습니다.
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 을 한 이유는 손익분기점이 되기 위해서는
고정비용을 넘어서야 하니까 하나를 더 팔아야 하기 때문이죠.
코딩일기를 작성해보니 확실히 제가 생각했던 사고 흐름을
다시 정리해볼 수 있어서 좋네요.
일주일에 하나씩이라도 꾸준히 올릴 수 있도록 하겠습니다.
코딩도 블로그도 계속해서 발전하도록 노력하겠습니다.
코드에 대한 조언은 언제나 환영이며, 오히려 부탁드리겠습니다.
무슨 말인지 1도 모르지만 화이팅하세요!