안녕하세요
인포돈 입니다.
백준 알고리즘 1712번 풀이입니다.
* 참고사항
- 개발환경은 eclipse을 기준으로 작성되었습니다.
- java언어를 이용하여 문제를 풀이합니다.
- 알고리즘 문제는 풀이를 보고 해답을 찾는 것도 중요하지만 무엇보다 스스로 풀이를 시도해봐야 합니다!!
(해당 풀이를 보기 전 충분히 문제에 대해 고민해봐야 합니다!)
- 해당 풀이 말고도 수많은 풀이 방법이 존재합니다.
백준 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을 출력한다.
입력 예시
1000 70 170
출력 예시
11
입력 예시
3 2 1
출력 예시
-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 br = new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();
StringTokenizer st = new StringTokenizer(str);
int bp = 0;
int[] bep = new int[3];
for(int i = 0 ; st.hasMoreTokens();i++)
bep[i] = Integer.parseInt(st.nextToken());
if(bep[2] > bep[1]) {
int x = bep[0]/(bep[2]-bep[1]);
bp = x + 1;
}else bp=-1;
System.out.println(bp);
}
}
해당 문제는 사실상 수학적으로 쉽게 계산할 수 있다면, 간단히 풀 수 있는 문제였던 거 같습니다.
처음 문제를 풀이할 때는 그냥 이걸 다 조건문과 반복문을 통해 풀어볼까? 하는 생각도 들었지만, 곰곰이 생각해보니 수학적으로 해당 수식을 보다 간결하게 표현할 수 있더라고요.
(STEP을 따라가시면 쉽게 이해하실 수 있습니다.)
STEP 1 함정 1 파헤치기(C, 판매 대수 식)
여기서 문제에서 주어진 A = 고정비용, B = 가변 비용, C = 상품 가격이라고 주어지면 해당 출력을 하기 위해서는 아래와 같이 식을 짤 수 있습니다.
A + (B*X) < (C*X)
여기서 X는 노트북이 한대 팔릴 때마다 1씩 증가되는 변수입니다.
그럼 해당 식을 간단히 정리하면 아래와 같이 표현할 수 있겠죠
A/(C - B) < X
자 해당 사항을 이해하셨다면, 입력 예시로 보여드리며 한 번 더 정확히 설명드리겠습니다. 우리가 출력하고 싶은 것은 바로 X가 되죠. 손익분기점을 넘는 판매 대수가 어느 정도냐
그럼 하나씩 대입해보면 아래와 같죠
1000 / (170 - 70) < X
10 < X
그렇다면, X는 10보다 큰 정수여야 하니(판매대수가 실수일 수는 없겠죠?) 11대가 됩니다.
이러한 이유로 저희는 X에 대한 식을 다음과 같이 정의할 수 있습니다.
X = (A/(C-B)) + 1
물론 (A/(C-B)) 해당 식이 소수점이 나올 수 있습니다. 그런데 저희는 int형의 특성을 알고 계시죠. 만약 int i에 10.5의 값을 넣게 되면 소수점 아래는 자동으로 버려지게 됩니다. 이에 따라 실수가 나오더라도 정확한 계산이 가능하게 되죠.
STEP 2 함정 2 파헤치기(손익분기점을 넘을 수 없는 경우)
앞서 X의 식이 세워졌으면, 이제 저희는 하나의 함정을 또 확인할 수 있죠.
만약에 C > B 이런 식이 성립하게 된다면...? 영원히 손익분기점을 넘을 수 없는 상황에 이르게 되죠. 이럴 경우 문제에서는 -1을 출력하도록 되어있습니다.
자 그럼 모든 함정을 저희는 고려해보았습니다. 그러면 쉽게 코드를 짤 수 있겠죠. 그럼 이제 코드를 짜기 위해서 흐름도를 만들어야 합니다.
입력받기 -> 받은 입력 분리하기 -> 분리한 입력들 중에 손익분기점을 넘을 수 없는 경우 걸러주기 -> 그렇지 않은 경우 앞서 구한 식 X를 구하기 -> X 출력하기
앞서 함정 파헤치기를 이해하셨다면, 해당 흐름도를 보면, "음.... 이렇게 짜면 되겠구나!"라는 생각이 드실 겁니다.
저 같은 경우
입력 받기 : BufferedReader 사용
받은 입력 분리하기 : StringTokenzier 사용, for문 사용
손익분기점 넘을 수 없는 경우 걸러주기 : if문 false값 사용
식 X 구하기 : if문 true값 사용
출력하기 : println 사용
이렇게 보면 짧은 코드 쉽게 이해하실 수 있을 겁니다.
'알고리즘 > 백준알고리즘' 카테고리의 다른 글
[백준알고리즘-JAVA]2869번 풀이(달팽이는 올라가고 싶다) (0) | 2021.04.12 |
---|---|
[백준알고리즘-JAVA]2292번 풀이(벌집) (0) | 2021.04.10 |
[백준알고리즘-JAVA]1152번 풀이(단어의 개수) (0) | 2021.04.08 |
[백준알고리즘-JAVA]1157번 풀이(단어공부) (0) | 2021.04.07 |
[백준알고리즘-JAVA]2675번 풀이(문자열 반복) (0) | 2021.04.06 |