ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준] 1712번: 손익분기점
    코딩(Coding)/백준 문제풀이 2020. 12. 22. 13:49
    728x90

    백준 알고리즘: 1712번: 손익분기점

    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을 출력한다.

     

    해당 문제는 아래 코드 처럼 단순하게(Brute-force?) 접근한다면 시간초과가 난다.

    예를들어 A=21억 B=1 C=2라고 할때, 당연히 아래 코드에선 시간초과가 나타난다.

    import sys
    a,b,c = sys.stdin.readline().split()
    a = int(a)
    b = int(b)
    c = int(c)
    
    def calc(a, b, c):
        i = 0
        while(True):
            totalIncome = a + (i*b)
            totalCost = i * c
    
            if(totalCost >= totalIncome):
                return i+1
    
            i += 1
    
    print(calc(a,b,c))

     

    따라서 해당 문제는 단순 반복을 통해 푸는것이 아니라 뭔가 수학적인 것이 첨가가 되어야 한다.

    우선 b가 c보다 크다면 손익분기점이 나타날수 없으므로 예외처리를 해준다.

    그리고 간단하게 C-B의 값을 A와 나눈값에 +1 해주어 몇번째에 최초로 이득이 생기는지 구할 수 있다.

    import sys
    a,b,c = sys.stdin.readline().split()
    a = int(a)
    b = int(b)
    c = int(c)
    
    def calc(a, b, c):
        if(b>=c):
            return -1
    
        return int(a/(c-b) + 1)
    
    print(calc(a,b,c))

    해당 문제는 어떻게 접근할 것인지에 대해 묻는것 같다. 확실히 아래 코드가 위에코드보다 가독성이 뛰어나다.

    728x90

    '코딩(Coding) > 백준 문제풀이' 카테고리의 다른 글

    [백준] 10174번: 팰린드롬  (0) 2020.12.29
    [백준] 1037번: 약수  (0) 2020.12.28
    [백준] 17608번: 막대기  (0) 2020.12.24
    [백준] 8958번: OX퀴즈  (0) 2020.12.24
    [백준] 4673번: 셀프 넘버  (0) 2020.12.23

    댓글

Designed by black7375.