티스토리 뷰
문제 링크 : https://www.acmicpc.net/problem/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을 출력한다.
#include <iostream>
#include <algorithm>
using namespace std;
int main(void)
{
int A, B, C, count = 1;
int temp = 0;
cin >> A >> B >> C;
if(B < C)
{
count = A / (C - B);
cout << count + 1 << endl;
}
else
{
cout << -1 << endl;
}
return 0;
}
얼핏보면 엄청 간단해 보이고 solved.ac에서도 난이도가 꽤 낮게 측정 되어 있어서 그냥 멋 모르고 돌렸다가는 오류 천지가 나는 문제이다. 실제로 이 문제의 질문하기 탭을 들어가보면 죄다 테스트 케이스는 정상적으로 출력되는데 무엇이 문제냐는 글들이 수두룩하다. 나도 문제대로 그냥 고정비용은 그대로 두고 가변비용을 증가시켜서 증가하는 판매비용과 비교하는 식으로 정석(?)적으로 돌렸는데 무수한 오답처리를 경험했다.
이 문제의 핵심은 문제 속에 있다기보다 입력하는 조건에 들어있다. 바로 입력이 21억 이하의 자연수라는 점. 극단적으로 말하면 입력이 21억이 들어올 수도 있다는 말이다. 보통 이런 문제 풀 때 자료형을 int를 쓸텐데, int가 21억 조금 넘게까지의 범위를 가지고 있으므로 단독으로 쓰면 문제가 없는데 여기다 곱하기나 더하기를 할 경우 에러가 나버린다. 한마디로 이 문제를 풀 때 매우매우 큰 수를 감당할 수 있는 자료형이 있다면 그것을 쓰던가, 아니면 더하기(+)와 곱하기(*) 등 수가 늘어날 수 있는 연산자를 쓰지 않아야 한다.
특정 연산자를 쓰지 말라는 이야기는 우리가 기본적으로 생각하는 손익분기점까지 판매비용을 증가시키기 방식이 먹히지 않는다는 것이다. 그래서 문제를 푸는 방법을 축약해서 공식화(?) 시키기로 하였다. 일단 고정비용은 얼마가 되던 딱히 상관이 없다. 늘어나지도 않고 줄어들지도 않아 언젠가 판매비용이 메꾸게 될 비용이다. 하지만 가변비용은 잘 봐야한다. 가변비용은 항상 판매비용보다 적어야한다. 아니면 아무리 많이 판매한다한들 가변비용에서 원가절감이 안되므로 항상 적자를 볼 수 밖에 없다. 판매비용이 가변비용보다 많아야만 언젠가 손익분기점을 넘어 이익을 볼 수 있다. 그래서 if문에 판매비용(C)이 가변비용(B)보다 많아야한다는 조건을 넣었다.
다음은 어떻게 판매량을 도출하는가의 문제다. 판매비용(C)이 가변비용(B)보다 많다면 이 둘은 항상 각자 같은 크기만큼 증가하므로 판매비용에서 가변비용을 뺀 값(B-C)만큼 차이가 난다는 것을 알 수 있다. 판매대수가 얼마나 되건 간에 말이다. 그렇다면 판매비용이 B-C만큼 나머지 값을 메울 수 있다는 의미이고, 여기서 나머지 값은 고정 비용이 된다. 즉, A / (B - C)를 하면 얼마나 팔아야 손익분기점이 생기는 지 알 수 있다.
마지막으로 else문에서는 손익분기점이 생기지 않을 경우를 처리한다. 질문하기 탭을 보니까 이거 처리를 안해줘서 틀리신 분도 많았다.
'백준 알고리즘' 카테고리의 다른 글
백준 9012번 : 괄호 [스택/C/C++] (0) | 2020.04.30 |
---|---|
백준 10250번 : ACM 호텔 [C/C++] (0) | 2020.04.27 |
백준 17828번 : 문자열 화폐 [문자열/스택/C/C++] (0) | 2020.04.23 |
백준 1316번 : 그룹 단어 체커 [문자열/C/C++] (0) | 2020.04.22 |
백준 1393번 : 음하철도 구구팔 [문자열/C/C++] (0) | 2020.04.20 |
- Total
- Today
- Yesterday
- 알고리즘 문제
- 컴퓨터이론
- 컴퓨터기초
- 서블릿
- 코딩
- 코딩 테스트
- It
- 컴퓨터공학
- Servlet
- 코드 리뷰
- 백준 풀이
- java
- 코딩테스트
- 컴퓨터과학
- 컴퓨터 네트워크
- 컴퓨터공학과
- 백준
- 컴퓨터
- 자바
- TCP
- jsp
- 네트워크
- C++
- C언어
- 알파넷
- 웹개발
- 프로그래밍
- 컴퓨터과학과
- 인터넷
- 알고리즘
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |