백준 알고리즘/기본수학1

[JAVA 자바] 백준 1712번 : 손익분기점

Sun720 2022. 6. 10. 10:06

▶ 문제

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

 

1712번: 손익분기점

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

www.acmicpc.net

 설명

 

이 문제는 예제를 통해 풀어냈다.

 

 

A, B, C 의 의미는 다음과 같다.

 

A 1000 : 고정비용

B 70     : 노트북 1개가 생산되는 가변비용

C 170   : 노트북 1개의 판매가

 

A와 B를 생산비라고 하고 C를 판매가라고 하여 둘로 나누어 살펴보자면 다음 표와 같은 계산이 나온다.

  1대 2대 ... 10대 11대 12대
A+B 1070 1140 ... 1700 1770 1840
C 170 340 ... 1700 1870 2040

노트북 10대의 생산가와 판매가가 같아지고, 11대가 되어서야 판매 금액이 생산가를 초과하기 시작한다.

정답인 11이 출력되어야 하므로 노트북 개수를 x로 놓는다면 수식을 만들어낼 수 있다.

 

수식 만들기

위의 예제대로 수식을 만들어 보겠다.

먼저, 1000 + (70 * x) 로 계산했을 때의 생산가보다 170 * x 로 계산했을 때의 판매가가 높아야 한다.

그러면 1000 + (70 * x) <  170 * x  라는 식이 성립이 된다.

x 값을 구하는 데 있어서 < 기호가 불편하므로 =로 바꾸고 판매가에서 +1을 더하여 손익분기점을 구하면 되겠다.

그러면 1000 + (70 * x) =  170 * x 로 연산식이 만들어지고

이 식을 그대로 A, B, C에 대입하여  x를 구할 수 있도록 단순화 하면 

x = A / C - B 가 만들어진다.

그렇게 구해진 x에 손익분기점을 구하기 위한 1을 더해주도록 하면 출력할 수 있는 결과가 나오게 된다.

 

조건 만들기

문제에서도 나왔듯 손익분기점이 나올 수 없는 구조가 있다.

B가 C보다 크거나 같은 수 일 경우가 그렇다.

C 가 A+B 를 제치는 순간이 있을 때 순익분기점이 발생하게 되는데 

B가 C보다 크거나 같은 수라면 순익분기점이 발생하지 않고 그 둘이 평행해 가면서 C가 A+B를 따라잡는 일이 생기지 않게 되기 때문이다.

 

x = A / C - B 수식으로 살펴봐도 이는 알 수 있다.

A분모를 가진 분자 C-B 가 마이너스 값이라면 x도 마이너스 값이 되는데 노트북 개수가 마이너스 되는 일이 없으므로 배제시켜야 한다. 또한 C-B 가 0이 된다면 x를 구하는 것 자체가 수학적으로 불가능하다.

 

범위 살펴보기

마지막으로 , 문제에서 범위를 21억 이하의 자연수라고 정해져 있다.

int 형의 최대 범위는 2,147,483,647 까지 인데, (int 형은 21억을 넘김)

A,B,C 끼리의 더하기와 곱하기 연산할 일이 없으므로 int 형으로 변수를 선언하면 된다.

 

이를 토대로 코드를 만들어보면 아래와 같다.

 

문제 풀이

🌱 풀이.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String str = br.readLine();
		StringTokenizer strTo = new StringTokenizer(str, " ");
		int a = Integer.parseInt(strTo.nextToken());
		int b = Integer.parseInt(strTo.nextToken());
		int c = Integer.parseInt(strTo.nextToken());

		if (c <= b) {
			System.out.println(-1);
		} else {
			System.out.println((a / (c - b)) + 1);
		}
	}

}

 

StringTokenizer 클래스로 한줄로 입력받은 문자열을 A, B, C 값으로 나누어 받도록 하였다.

그 다음 b와 c 를 비교한 후 c가 크다면 연산을 수행하도록 한다.

 

 

 

728x90
반응형