안녕하세요
백준 알고리즘 단계별로 풀어보기 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)
'알고리즘 > 알고리즘JAVA' 카테고리의 다른 글
[백준알고리즘/기본 수학 1단계] 1193번 문제 : 분수찾기(자바/JAVA) (0) | 2021.05.24 |
---|---|
[백준알고리즘/기본 수학 1단계] 2292번 문제 : 벌집(자바/JAVA) (0) | 2021.05.22 |
[백준알고리즘/문자열] 1316번 문제 : 그룹 단어 체커(자바/JAVA) (0) | 2021.05.20 |
[백준알고리즘/문자열] 2941번 문제 : 크로아티아 알파벳(자바/JAVA) (0) | 2021.05.19 |
[백준알고리즘/문자열] 5622번 문제 : 다이얼(자바/JAVA) (0) | 2021.05.18 |