@@@ 알고리즘/백준 스터디

백준 5710(전기 요금) - 해결

HTG 2022. 2. 2. 17:24
728x90

전기 요금

 

문제

최근에 전기 회사는 전기 요금을 또 올렸다. 새로운 전기 요금은 아래 표에 나와있다. (사용량은 항상 양의 정수)


사용량 (Watt-hour) 요금 (원)
1 ~ 100 2
101 ~ 10000 3
10001 ~ 1000000 5
> 1000000 7

위의 표를 읽는 방법은 다음과 같다.

사용량의 첫 100Wh의 가격은 1Wh당 2원이다. 다음 9900Wh (101 ~ 10000)의 가격은 1Wh당 3원이다. 이런식으로 계속 계산한다.

예를 들어, 10123Wh를 사용했을 때, 내야하는 요금은 2×100 + 3×9900 + 5×123 = 30515원이다.

전기 회사는 전기 요금을 인상하지 않고 돈을 더 버는 이상한 방법을 만들었다. 그 방법은 바로 사용한 전기의 양을 알려주지 않고, 얼마를 내야 하는지 알려주는 것이다. 전기 회사는 요금과 관련된 정보를 나타내는 두 숫자 A와 B를 알려준다. A와 B는 전기 회사에서 그 사람이 사는 건물에서 임의로 고른 이웃의 정보와 합친 요금이다.

  • A: 이웃의 사용량과 사용량을 합쳤을 때 내야하는 요금
  • B: 이웃의 전기 요금과의 차이 (절댓값)

위의 두 숫자를 이용해서 자신이 얼마를 내야 하는지를 계산할 수 없을 때는, 계산 요금을 100원을 더 내면 전기 회사에서 사용량을 알려준다.

상근이는 매우 전기를 아끼는 사람이다. 따라서, 항상 자신이 사는 건물에서 가장 전기를 적게 쓴다고 확신한다. 상근이는 돈도 전기만큼 아낀다. 따라서, 절대로 계산 요금을 지불하지 않고 자신이 직접 계산할 것이다.

예를 들어, A = 1100, B = 300이라고 하자. 이 정보를 이용하면, 상근이의 사용량은 150Wh, 이웃의 사용량은 250Wh임을 알 수 있다. 두 사람의 총 사용량은 400Wh이다. 따라서, A = 2×100 + 3×300 = 1100이 된다. 따라서, 상근이는 350원을 내면 된다. 상근이의 이웃은 2×100 + 3×150 = 650원을 내야 하고, B = |350 - 650| = 300이 된다.

A와 B가 주어졌을 때, 상근이가 내야하는 전기 요금을 구하는 프로그램을 작성하시오.

 

입력

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

입력의 마지막 줄에는 0이 두 개 주어진다.

 

출력

각 테스트 케이스에 대해서, 상근이가 내야 하는 요금을 출력한다.


이번에도 이분탐색 문제

탐색하고자 한 것은 내 사용량을 기준으로 하였다.

처음에 A 로 총 사용량을 구하고 그리고 left = 1, right = (구한 사용량의 반), mid = (내 사용량) 으로 탐색을 시작한다.

판단 방법은 내 사용량과 이웃 사용량으로 요금을 구하고 B 와 판단을 한다.

차이가 작으면 차이를 늘리기 위해 사용량을 줄이고자 r = mid - 1, 

차이가 크면 차이를 줄이기 위해 사용량을 늘리고자 l = mid + 1

 

import sys
input = sys.stdin.readline

# 요금 구하기
def account(N):
    
    if N <= 100:
        return N * 2
    elif N < 10000:
        return 100 * 2 + (N-100) * 3
    elif N < 1000000:
        return 100 * 2 + 9900 * 3 + (N-10000) * 5
    else:
        return 100 * 2 + 9900 * 3 + 990000 * 5 + (N-1000000) * 7

while 1:
    A, B = map(int,input().split())
    # 끝
    if A == B == 0:
        break
    # 사용량 구하기
    if A <= 200:
        Wh = A//2
    elif A <= 2*100 + 3*9900:
        Wh = 100 + (A-2*100)//3
    elif A <= 2*100 + 3*9900 + 5*990000:
        Wh = 10000 + (A-2*100-3*9900)//5
    else:
        Wh = 1000000 + (A-2*100-3*9900-5*990000)//7
    # 가장 작은 사용량은 1
    # 이웃보다 무조건 작기 때문에 가장 큰 사용량은 사용량의 반 
    l = 1
    r = Wh//2
    
    while l <= r:
        # 내 사용량
        mid = (l+r)//2
        # 이웃 사용량
        Ne = Wh - mid
        # 요금차이
        diff = account(Ne) - account(mid)
        # B와 비교 
        if diff > B:
            l = mid + 1
        else:
            r = mid - 1
    
    print(account(l))