Java/BackJoon

[Bac|<joon>] 백준 1712 : 손익분기점 / 사용자입장 , 관건은 처리시간!

모모토 2021. 4. 27. 17:17
반응형

 

이 코드를 보고 처음에 실수한 두가지가 있는데, 이 두가지에 유의하면서 코드를 짜보겠다. 자, 우리가 구해야 할것은 무엇인가? 바로 손익분기점이 넘어가는 시점의 판매량을 구하는것이다. 간단하게 손익분기점 구하는식을 들여다보자

 

손익분기점 구하는 식

 

A(고정비용)+B(가변비용) * i = C(판매가) * i  --> 이때의 i가 바로 우리가 구하는 값이다.

 

이때 좌변을 변수 X로 우변을 Y로 설정하여 " if(X<Y) {} " 구문을 생각한 사람이 있다면 바로 나다. 이게 바로 첫번째 실수다. 만약 고정비용이 너무 클 경우엔 손익분기점 또한 높아질것이다. 그러면 i값의 범위가 우리가 감당못할만큼 커질수도 있고 그런경우엔 처리시간이 길어진다. 따라서 우리가 구해야할것을 간결하게 구해주는걸 우선시 하는 습관을 들여야한다. 나같은 코린이같이 if문 for문부터 생각하면 안된다.

 

그렇다면, 손익분기점 식을 살짝 바꿔보자

 

A = (C-B) * N  -->  N = A/(C-B) +1

 

N은 지출비용과 판매이익이 같아지는 시점의 값이므로 +1을 해주면 우리가 원하는 값을 깔끔하게 구해줄 식이 탄생하였다. 여기서 두번째 실수가 발생한다.

 

프로그래밍할때, 개발자는 사용자가 적절한값을 알아서 넣길 기대하면 안된다.

 

나의 실수요인은 어떤값에도 대응할 수 있는 코드를 짜야했는데 그러지 못했다. 눈치 챈 사람도 있겠지만 분모자리에 연산이 존재한다. 바로 C-B인데 이게 무슨의미이냐 하면 바로 분모자리에 0이 올수도 있다는 얘기이다. 만약 분모자리에 0이 오면 프로그램은 에러가 발생한다. 음수이면 이익이 안난다는 뜻이다.

 

N을 구하기도 전에 입력한 데이터가 앞으로 이익을 낼 수 있는지 손해를 볼 지, 이익도 손해도 내지않는지를 알 수 있다.

따라서 간결한 코드를 구현할 수 있고 데이터의 처리시간도 단축시킬수있다. 코딩에 입문한 사람에겐 여러방면에서 좋은 의미로 다가갈수있는 문제였다.


Answer

import java.util.Scanner;

public class B1712 {
	public static void main(String[] args) {
		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 {
				int N = A / (C - B) + 1;
				System.out.println(N);
			}
		
	}
}