글 작성자: 취업중인 피터팬
728x90

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

 

1712번: 손익분기점

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

www.acmicpc.net

 

일단 문제 이해가 잘 안돼서 한참을 봤습니다.

간단히 말하면 결국 고정 지출 + (병동지출 * 판매개수) 의 금액보다 노트북가격 * 판매개수의 금액이 커지는 판매 개수의 수를 구하라는 문제입니다.

 

두가지 방법을 사용해서 풀 수 있습니다.

 

1. 직관적으로 문제 그대로 코딩하는 방법

2. 부등호 식을 이용해서 문제를 푸는 방법

 

사실 1번은 시간이 오래 걸려서 백준에서는 정답으로 쳐주지를 않더라고요. 상황에 따라 다르겠지만 웬만하면 시간이 오래 걸리지 않는 코딩이 좋은 코딩이겠죠 그래도 두 개다 소개를 해보도록 하겠습니다.

 

오답

import java.util.*;

public class Main{
    public static void main(String[] args){
       Scanner sc = new Scanner(System.in);
		
		
		long spne = sc.nextInt();//고정 지출 
		long chne = sc.nextInt();//변동 지출 
		long price = sc.nextInt();//가격 
		
		long saleCount = 1;
		long amountSpend = spne + chne;
		
		if(chne < price) {
			long nowPrice = price;
			while(amountSpend >= price) {
				amountSpend = spne + (chne * saleCount);
				price = nowPrice * saleCount;
				saleCount++;
				//System.out.println("amoutSpend : " + amountSpend);
				//System.out.println("price : " + price);
			}
		}else {
			saleCount = 0;
		}
		
		System.out.println(saleCount-1);
    }
}

큰 수가 들어오게 되면 정수형(Integer)로는 받을 수가 없습니다. 그래서 모두 long형으로 선언해 주었고 단순하게 있는 그대로 코딩했습니다. 총지출이 판매액보다 클때 계속 while문을 돌리고 판매액이 더 커졌을 때 saleCount를 출력해주는 형식입니다.

이렇게 코딩을 하게 되면 결과는 얻을 수 있지만 시간이 너무 오래 걸립니다. 그렇기 때문에 저희가 수학을 배우는 거죠

 

정답

import java.util.*;

public class Main{
    public static void main(String[] args){
       Scanner sc = new Scanner(System.in);
		
		int fixSpending = sc.nextInt();
		int changeSpending = sc.nextInt();
		int price = sc.nextInt();
		
		if(changeSpending >= price) {
			System.out.println("-1");
		}else {
			System.out.println((fixSpending/(price-changeSpending))+1);
		}
    }
}

 

부등호 연산을 기억하시나요?

기본적으로 변동 지출이 가격보다 크면 절대로 수익을 낼 수 없기 때문에 조건문으로 -1를 걸어줍니다.

그 다음 식을 이용해서 출력을 하였습니다.

고정 지출 + (변동 지출 * 판매 개수) < 노트북 가격 * 판매 개수

에서 판매개수의 최소값을 구하는 문제입니다.

 

좀 더 수학적으로 쓰면

x + (y*n) < z * n

에서 n의 최소값을 구하는 문제입니다.

x + (y*n) < z * n

x < (z*n) - (y*n)

x< n*(z-y)

x(z-y) < n

 

글자 풀이

고정 지출 + (변동 지출 * 판매 개수) < 노트북 가격 * 판매 개수

고정 지출 < (노트북 가격 * 판매 개수) -(변동 지출 * 판매 개수)

고정 지출 < 판매 개수*(노트북 가격 - 변동 지출)

고정 지출/(노트북 가격- 변동 지출) < 판매 개수

 

결국  판매 개수의 최소 값은 (고정 지출/(노트북 각겨 - 변동 지출)) + 1 가 되게 됩니다.