개발 공부/알고리즘 문제풀이

[백준] 1712. 손익분기점

5묘 2022. 7. 21. 01:00
 

1712번: 손익분기점

월드전자는 노트북을 제조하고 판매하는 회사이다. 노트북 판매 대수에 상관없이 매년 임대료, 재산세, 보험료, 급여 등 A만원의 고정 비용이 들며, 한 대의 노트북을 생산하는 데에는 재료비와

www.acmicpc.net


이 문제를 푸는 데 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 날짜 바꾸기 · ksw의 삽질연대기

문제 상황 잔디 심기를 할때 특정일을 놓치는 경우 유용(?)하게 쓸수 있는 꼼수(-_-..) 방법 마지막 Commit 날짜를 현재 날짜로 설정 git commit --amend --no-edit --date "$(date)" 마지막 Commit 날짜를 임의의 날

kwonsoonwoo.github.io

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