loading

알고리즘/알고리즘JAVA

[백준알고리즘/기본 수학 1단계] 1712번 문제 : 손익분기점(자바/JAVA)

침착곰 2021. 5. 22. 00:35
반응형

안녕하세요

백준 알고리즘 단계별로 풀어보기 8단계 1712번 문제 손익분기점을 풀어봤습니다

처음 문제를 풀었을 때 계속해서 시간초과 에러가 나와서 당황한 문제였습니다;;

이 문제는 프로그래밍 실력을 보는게 아니라 수학 문제를 푼다 생각하고 풀면 어렵지 않게 풀 수 있습니다

저도 그것때문에 계속 해메다가 답을 풀었습니다 ㅠ

제가 풀은 방법에 대해서 설명하겠습니다!

 


문제

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

예를 들어 A=1,000, B=70이라고 하자. 이 경우 노트북을 한 대 생산하는 데는 총 1,070만원이 들며, 열 대 생산하는 데는 총 1,700만원이 든다.

노트북 가격이 C만원으로 책정되었다고 한다. 일반적으로 생산 대수를 늘려 가다 보면 어느 순간 총 수입(판매비용)이 총 비용(=고정비용+가변비용)보다 많아지게 된다. 최초로 총 수입이 총 비용보다 많아져 이익이 발생하는 지점을 손익분기점(BREAK-EVEN POINT)이라고 한다.

A, B, C가 주어졌을 때, 손익분기점을 구하는 프로그램을 작성하시오.

 

입력

첫째 줄에 A, B, C가 빈 칸을 사이에 두고 순서대로 주어진다. A, B, C는 21억 이하의 자연수이다.

 

출력

첫 번째 줄에 손익분기점 즉 최초로 이익이 발생하는 판매량을 출력한다. 손익분기점이 존재하지 않으면 -1을 출력한다.

 

 


 

문제 풀이

첫 번째 방법은 무식하게 while문을 사용하여 풀은 방식입니다

이 방식으로 문제를 풀면 풀리지만 시간이 엄청나게 오래걸립니다

풀긴 풀었는데 이상하네;;

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 변수 및 StringTokenizer 변수 선언 및 데이터 입력
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));		
		StringTokenizer st = new StringTokenizer(br.readLine(), " ");
		
		// a, b, c 변수 선언
		long a = Integer.parseInt(st.nextToken());
		int b = Integer.parseInt(st.nextToken()), 
				c = Integer.parseInt(st.nextToken());
		
		// b가 c보다 크거나 같다면 "-1"을 출력하고 return
		if(b >= c) {
			System.out.print(-1);
			return;
		}
		
		// 손익분기점을 넘길 갯수 및 sum변수 선언
		int count = 0; 
		long b_sum = 0, c_sum = 0;
		
		// 반복문을 사용하여 손익분기점이 넘으면 break
		while(true) {
			count++;
			b_sum += b;
			c_sum += c;
			if(a + b_sum < c_sum) {
				System.out.print(count);
				break;
			}			
		}			
	}
}

 


 

두 번째 방법은 공식을 사용해서 푸는 방식입니다

공식을 사용하면 간단하게 풀 수 있는 문제였습니다...

a / (c - b) + 1을 하면 손익분기점 갯수를 구할 수 있습니다

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 변수 및 StringTokenizer 변수 선언 및 데이터 입력
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));		
		StringTokenizer st = new StringTokenizer(br.readLine(), " ");

		// a, b, c 변수 선언
		long a = Integer.parseInt(st.nextToken()),
			b = Integer.parseInt(st.nextToken()), 
			c = Integer.parseInt(st.nextToken());
		
		// 손익분기점 갯수 : a / (c - b) + 1 로 계산
		int count = -1;
		if(b < c) {
			count = (int) ((a / (c - b)) + 1);
		}
		
		// 결과 출력
		System.out.print(count);
	}
}

 


 

세 번째 방법은 위와 동일하지만 손익분기점의 갯수를 메서드로 구합니다

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 변수 및 StringTokenizer 변수 선언 및 데이터 입력
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));		
		StringTokenizer st = new StringTokenizer(br.readLine(), " ");

		// a, b, c 변수 선언
		int a = Integer.parseInt(st.nextToken()),
			b = Integer.parseInt(st.nextToken()), 
			c = Integer.parseInt(st.nextToken());

		// 결과 출력 -> 손익분기점 메서드 호출
		System.out.print(calc(a, b, c));
	}

	// 손익분기점 메서드 선언
	// 손익분기점 갯수 : a / (c - b) + 1 로 계산
	static int calc(int a, int b, int c)
	{		
		int count = -1;
		if(b < c) {
			count = (int) ((a / (c - b)) + 1);
		}		
		
		return count;
	}
}

 

이제 속도 비교를 해보겠습니다

 


 

속도 비교

1. while문 사용

2. 공식 사용

3. 공식 사용(메서드)

입니다

보시면 알겠지만 첫 번째 방식은 시간이 엄청나게 오래 걸리는 것을 볼 수 있습니다 ㅎㄷㄷㄷ;;

2, 3번 방식은 시간이 많이 절약됩니다

아무래도 이번 단계의 취지는 알고리즘을 연구해 계산해서 결과를 도출하는 것을 목적으로 하는 것 같습니다

다른 의미로 머리를 써야 풀 수 있는 문제들이 있을 것 같습니다!

 

세 번째 방법으로 상위권에 갔네요 ^오^

 

이상 백준 알고리즘 1712번 손익분기점을 풀은 내용이었습니다

 

다음 문제 : 2021.05.22 - [알고리즘/알고리즘JAVA] - [백준알고리즘/기본 수학 1단계] 1712번 문제 : 벌집(자바/JAVA)

반응형
그리드형