반응형

https://www.acmicpc.net/problem/5710

 

5710번: 전기 요금

입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스는 한 줄로 이루어져 있고, 두 정수 A와 B가 주어진다. (1 ≤ A, B ≤ 109) 항상 정답이 유일한 경우만 주어지며, 입력으로 주어지

www.acmicpc.net

 

해결 방법 : 이분 탐색

  • 우선, 이웃은 상근이 보다 더 많은 요금을 내므로, 상근이 요금 + 이웃의 요금 = B이다.
  • 요금을 통해 전기 사용량을 반환하는 함수 money_to_wh()와, 전기 사용량에 따른 요금을 반환하는 함수 wh_to_money()를 작성한다면, 다음과 같은 식이 성립한다.
    • A = wh_to_money(money_to_wh(X) + money_to_wh(X + B)) , (X = 상근이의 요금)
  • 이제 상근이의 요금 X와 위 식을 기준으로 이분 탐색!
import sys
input = sys.stdin.readline

def solution(A, B):
    whs = [0, 100, 10000, 1000000, float('inf')]
    fees = [2, 3, 5, 7]
    tot_fees = [100 * 2, 9900 * 3, 990000 * 5, float('inf')]

    def money_to_wh(money): # 요금 -> 전기 사용량
        for i in range(len(tot_fees)):
            if money < sum(tot_fees[:i+1]):
                return whs[i] + (money - sum(tot_fees[:i])) / fees[i]

    def wh_to_money(wh): # 전기 사용량 -> 요금
        for i in range(len(whs)):
            if wh < whs[i]:
                return sum(tot_fees[:i-1]) + (wh - whs[i-1]) * fees[i-1]

    mn, mx = 1, 10**9
    while mn < mx - 1: # 이분 탐색
        mid = (mn + mx) // 2
        if wh_to_money(money_to_wh(mid) + money_to_wh(mid + B)) <= A:
            mn = mid
        else:
            mx = mid

    return mn

if __name__ == '__main__':
    while True:
        A, B = map(int, input().split())
        if A == B == 0:
            break
        result = solution(A, B)
        print(result)
반응형

'IT study > 알고리즘 문제 풀이' 카테고리의 다른 글

백준 3077 : 임진왜란  (0) 2021.08.12
백준 9081 : 단어 맞추기  (0) 2021.08.11
백준 10026 : 적록색약  (0) 2021.08.09
백준 7562 : 나이트의 이동  (0) 2021.08.09
백준 9204 : 체스  (0) 2021.08.07

+ Recent posts