이 문제를 푸는 데 2번을 틀려서, 3번 코드를 짰다!
각각 다른 이유로 틀렸기 때문에, '아, 이런 것도 미리 생각하고 짰어야 했는데' 라는 생각의 연속을 겪었다.
(하지만 나는 AI가 아니라 인간이기에... 디버거를 돌리지 않으면 잘 모른다...ㅋㅋㅋㅋㅋ)
우선 첫번째 시도는 이러했다.
판매대수를 n이라고 설정해두고, 문제를 풀었는데 '손익분기점이 나지 않을 때는 -1을 출력해야 한다.'는 부분을 읽으며 어떻게 하면 반복문을 돌리기 전에 손익분기점을 도달할 수 있는지 여부를 알 수 있을지 고민했다.
결과적으로 간단한 이항을 활용하면 되는 부분이었다. 가령 A=3, B=2, C=1 일 때 n > 2n + 3을 따져보면 n < -3으로 음수이다. 이 경우는 -1을 출력해야 한다. 하지만 A=1000, B=70, C=170일 경우 170n > 70n + 1000을 따져보면 n > 10으로 양수이다. 그래서 우선, A / (C - B)가 음수이면, 결코 손익분기점에 도달할 수 없으니 -1을 출력하도록 코드를 짜봤다.
# 1712 손익분기점
A, B, C = map(int, input().split())
n = 1
profit = n * C
loss = n * B + A
if (A / (C - B) < 0) :
print(-1)
else:
while True:
profit = n * C
loss = n * B + A
if profit > loss:
print(n)
break
else:
n += 1
이렇게 짰더니 코드는 정상작동하는데, 예제 3번의 A:2100000000 이게 값이 너무 커서 시스템이 멈춰버렸다. 그래서 다르게 접근할 필요를 느끼고 고민했다. 반복문을 돌리지 않고도, 아까 -1을 출력했던 것처럼 손익분기점을 넘어서는 n의 값을 알아낼 수 있지 않을까? 하고.
아까 앞에서 A / (C - B) 이 값이 0보다 작으면 손익분기점 결코 넘을 수 없다고 했다. 그럼 손익분기점을 넘는 수는, 저 A / (C - B)라는 값에 +1을 하면 되지 않을까? 하고 다시 코드를 짰다. 두번째 시도였다.
만약 A / (C-B)가 float형으로 소수점이 붙어있을 경우에는, +1을 한 값에 소수점을 floor로 버리도록 했다. 가령 4.5 < n일 경우 n이 5개부터 손익분기점을 넘길 수 있다는 것이므로 4.5+1 = 5.5인 상태에서 0.5를 버림한다.
import math
A, B, C = map(int, input().split())
n = 1
profit = n * C
loss = n * B + A
if (A // (C - B) < 0) :
print(-1)
else:
n = (A // (C - B)) + 1
print(math.floor(n))
그랬더니 이번엔 ZeroDivisionError가 떠버렸다. 가만 생각해보니 -1이 결과값이 되는 상황(=손익분기점 도달 불가능) 중 3+n < n과 같은 상황도 있을 것이라는 생각이 들었다. 그래서 그런 케이스를 하나 더 조건에 추가해줬다.
import math
A, B, C = map(int, input().split())
n = 1
profit = n * C
loss = n * B + A
# C-B가 0인 상황 추가(ZeroDivisionError 방지)
if (C - B) == 0:
print(-1)
elif (A // (C - B) < 0) :
print(-1)
else:
n = (A // (C - B)) + 1
print(math.floor(n))
이렇게 했더니 깔끔히 통과~되었다.
++) 추가적으로 Git 관련 팁!
문제를 다 풀었더니 12시가 넘어버려서 1일 1커밋 도전이 흔들릴 위기에 처했다. 그런데 찾아보니 commit 날짜를 변경하는 방법이 있었다!
git commit --amend --no-edit --date "Mon 20 Aug 2018 20:19:19 KST"
이 "" 사이에 어제 날짜를 넣어줬더니 github에 어제 날짜에도 잔디가 심어진 것을 볼 수 있었다..!
'개발 공부 > 알고리즘 문제풀이' 카테고리의 다른 글
[백준] 1193. 분수찾기 (0) | 2022.07.23 |
---|---|
[백준] 2292. 벌집 (0) | 2022.07.21 |
[백준] 1316. 그룹 단어 체커 (0) | 2022.07.20 |
[백준] 2941.크로아티아 알파벳 (0) | 2022.07.20 |
[백준] 5622. 다이얼 (0) | 2022.07.19 |