[알고리즘 문제 풀이][수학] 백준 1712번 - 손익분기점
백준 1712번 손익분기점 문제입니다.
(기초 수학 사칙연산 문제)
- 문제 설명: https://www.acmicpc.net/problem/1712
- 문제 풀이:
본 문제는 풀이가 간단하기 때문에, 아래의 내용을 보기 전에 직접 잠깐 고민해보는 것을 추천합니다.
문제에 따르면 A는 고정 비용, B는 노트북 1대 팔 때 드는 가변 비용, C는 노트북 1대를 팔아서 얻는 매출입니다.
이때 손익분기점을 구하라는 문제입니다. 예시를 보면 노트북을 만들 때 드는 비용 == 판매해서 얻은 매출, 이렇게 비용과 이익이 같아지는 경우가 아니라 1개라도 더 팔아서 이익이 나는 시점이 정답으로 인정됩니다.
첫번째 예시를 보면 다음과 같습니다.
입력
1000 70 170
출력
11
1000 이 이미 비용이 들어갔고, 1대당 70 씩 비용이 듭니다. 그리고 1대를 팔면 170 을 얻을 수 있습니다. 그러면 노트북을 10대를 파는 순간 1000 + (70 x 10대) = 170 x 10 대 로 들어간 비용과 매출이 같아집니다. 여기서 1대를 더 파는 순간 이익이 나기 때문에 11이 정답이 됩니다.
아무리 팔아도 이익이 안 나는 경우는 -1을 출력하면 됩니다. 예를 들어, 1대를 만들 때 드는 비용과, 1대를 팔았을 때 얻는 매출이 동일하면 아무리 팔아도 손익분기점을 넘을 수가 없으므로 -1이 되어야합니다. 또는 비용이 역전되어서 1대를 팔수록 오히려 손해가 난다면 -1을 출력해야합니다.
이 문제를 풀기 위해서 아래와 같은 식을 세웠습니다.
C x N > A + (B x N)
A, B, C는 문제에서 주어지고, N을 구해야합니다.
위의 식을 간단하게 정리하면 다음과 같습니다.
(C x N) - (B x N) > A
(C - B) x N > A
N > A / (C - B)
즉, A / (C - B) 한 몫에 +1 한 값을 출력하면 됩니다.
코드를 작성하기 전에 여기서 주의해야할 것이 있는데, C 와 B가 같은 경우 분모가 0 이 되기 때문에,
코드 제출시 런타임에러가 발생합니다. 같은 경우 분모로 들어가지 않도록 처리가 필요합니다!
- 코드:
A, B, C = map(int, input().split())
if B - C >= 0: print(-1)
else: print(A // (C - B) + 1)
- 실수 포인트 & 반례:
(1) 시간 초과
1 ~ 21억 까지 for문을 돌면서 손익분기점을 넘는지 매번 일일히 체크하게 코드를 짠다면 시간 초과가 납니다. 위의 풀이 방법처럼 식으로 변경하여 풀이해야합니다.
(2) 런타임 에러 (Zero Division Error)
B와 C가 같은 경우를 처리하지 않고 분모로 (C - B) 를 나누게 되면 Zero Division Error 가 발생합니다.
그러면 if 문으로 같은 경우 -1 을 출력하게 하거나, try: except ZeroDivisionError: 를 작성하여 -1 을 출력하게 하면 됩니다.
입력: 100 70 70
정답: -1
(3) 오답
질문게시판에서 보이는 대부분의 실수는 손익분기점을 넘는 경우 +1 이 제대로 되지 않는 것이었습니다.
아래 게시판의 반례를 넣어보면 대부분 답이 2로 출력되지 않고 1로 출력됩니다.
입력: 100 10 100
정답: 2
대부분의 오답: 1
+ 이 외에 코드 실수로 인해 아예 답이 출력되지 않는 경우도 있었습니다. (if문에는 return 을 썼지만 elif 문에는 빠트리는 경우, B != C인 경우만 고려하고, B == C인 경우는 실행될 코드가 아예 없는 경우)
(2), (3) 의 예시를 넣어보면서 답이 모든 경우에 잘 출력되는지 확인하면 좋을 것 같습니다.