Today.dev

[BOJ_5710/Python] 전기 요금 본문

알고리즘/백준

[BOJ_5710/Python] 전기 요금

otu165 2021. 7. 5. 03:01

문제

5710번: 전기 요금

 

5710번: 전기 요금

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

www.acmicpc.net

 


풀이

import sys
input = sys.stdin.readline


def get_wh_from_bill(bill):
    arr = [100 * 2, 100 * 2 + 9900 * 3, 100 * 2 + 9900 * 3 + 990000 * 5]

    if bill <= arr[0]:
        return bill // 2
    if bill <= arr[1]:
        return 100 + (bill - arr[0]) // 3
    if bill <= arr[2]:
        return 10000 + (bill - arr[1]) // 5

    return 1000000 + (bill - arr[2]) // 7


def get_bill_from_wh(wh):
    arr = [100, 10000, 1000000]

    if wh < arr[0]:
        return wh * 2
    if wh < arr[1]:
        return 100 * 2 + (wh - 100) * 3
    if wh < arr[2]:
        return 100 * 2 + 9900 * 3 + (wh - 10000) * 5
    return 100 * 2 + 9900 * 3 + 990000 * 5 + (wh - 1000000) * 7


def binary_search(start, end, target):
    total_wh = end  # (상근 + 이웃) 전기사용량

    while True:
        my_wh = (start + end) // 2  # 상근이 전기사용량
        your_wh = total_wh - my_wh  # 이웃 전기사용량

        diff = get_bill_from_wh(your_wh) - get_bill_from_wh(my_wh)

        if diff == B:
            return get_bill_from_wh(my_wh)

        if diff > B:
            start = my_wh + 1
        else:
            end = my_wh - 1


while True:
    A, B = map(int, input().split())  # 1 <= A, B <= 10^9

    # 종료 조건
    if A + B == 0:
        break

    # 1. 총 전기 사용량(Wh) 구하기
    wh = get_wh_from_bill(A)

    # 2. 상근이의 전기 사용량 구하기
    print(binary_search(1, wh, B))

문제에서 주어진 조건(A, B)을 최대한 활용해서 풀었다. 개인적으로 이분 탐색을 반복할때마다 전기 사용량을 요금으로 바꿔서 비교하는 과정이 번거로워보여서 시간 초과가 나지 않을까 걱정했는데, 다행히 시간 초과 없이 통과할 수 있었다.

'알고리즘 > 백준' 카테고리의 다른 글

[BOJ_16954/Python] 움직이는 미로 탈출  (0) 2021.07.05
[BOJ_3190/Python] 뱀  (0) 2021.07.05
[BOJ_1697/Python] 숨바꼭질  (0) 2021.07.05
[BOJ_14499/Python] 주사위 굴리기  (0) 2021.07.05
[BOJ_1339/Python] 단어 수학  (0) 2021.05.31
Comments