문제 보러 가기!!
재밌는 이분 탐색 문제였다~
처음에 left를 0, right를 A로 삼고 이분 탐색을 시작했다.
상근이가 내는 전기 요금이 mid라고 가정하고, 아래 계산이 맞는지 봤다.
1. 상근이가 내는 전기 요금을 가지고, 상근이가 쓴 전기 사용량을 계산한다.
2. 상근이가 쓴 전기 요금에 B를 더하면 이웃이 쓴 전기 요금이 된다. 이를 가지고 이웃이 쓴 전기 사용량을 계산한다.
3. 상근이가 쓴 전기 사용량과 이웃이 쓴 전기 사용량을 합쳤을 때 내야 하는 요금을 계산한다.
4. 3번의 결과와 A를 비교한다.
4-1. 같으면 정답이다!
4-2. 3번의 결과가 A보다 더 크면, 상근이가 쓴 전기 요금(mid)을 낮추어야 한다.
4-3. 3번의 결과가 A보다 더 작으면, 상근이가 쓴 전기 요금(mid)을 높여야 한다.
import sys
input = sys.stdin.readline
while True:
A, B = map(int, input().split())
if A == 0 and B == 0:
break
# 적은 사람의 전기 사용량 기준으로 이분 탐색하기
left = 0
right = A
while left <= right:
mid = (left + right) // 2
a = mid # 상근이가 내는 전기 요금
# 상근이가 쓴 전기 사용량 계산
a_mount = 0
if 200 >= a >= 1:
a_mount += (a / 2)
elif 29900 >= a > 200:
a -= 200
a_mount = 100 + (a) / 3
elif 4_979_900 >= a > 29900:
a -= 29900
a_mount = 10000 + (a) / 5
elif a > 4_979_900:
a -= 4_979_900
a_mount = 1000000 + (a) / 7
b = mid + B # 다른 이웃이 내는 전기 요금
b_mount = 0 # 다른 이웃이 내는 전기 사용량 계산
if 200 >= b >= 1:
b_mount += (b / 2)
elif 29900 >= b > 200:
b -= 200
b_mount = 100 + (b) / 3
elif 4_979_900 >= b > 29900:
b -= 29900
b_mount = 10000 + (b) / 5
elif b > 4_979_900:
b -= 4_979_900
b_mount = 1000000 + (b) / 7
# 상근이와 이웃이 사용한 전기 사용량을 합쳤을 때 내야 하는 요금 계산하기
a_b_sum_mount = a_mount + b_mount
a_b_sum = 0
if 100 >= a_b_sum_mount >= 1:
a_b_sum += (a_b_sum_mount * 2)
elif 10000 >= a_b_sum_mount >= 100:
a_b_sum_mount -= 100
a_b_sum = 200 + (a_b_sum_mount) * 3
elif 1000000 >= a_b_sum_mount > 10000:
a_b_sum_mount -= 10000
a_b_sum = 29900 + (a_b_sum_mount) * 5
elif a_b_sum_mount > 1000000:
a_b_sum_mount -= 1000000
a_b_sum = 4979900 + (a_b_sum_mount) * 7
# A와 계산 결과가 같은지 보기
if A == a_b_sum:
print(mid)
break
elif A > a_b_sum:
left = mid + 1
else:
right = mid - 1
728x90
'즐거운 PS 👩💻🥰' 카테고리의 다른 글
[백준-파이썬] 1202: 보석 도둑 (0) | 2022.02.07 |
---|---|
[백준-파이썬] 2075: N번째 큰 수 (0) | 2022.02.05 |
[백준-파이썬] 20157: 화살을 쏘자! (0) | 2022.01.26 |
[백준-파이썬] 17349: 1루수가 누구야 (0) | 2022.01.19 |
[백준-파이썬] 11779: 최소 비용 구하기2 (0) | 2022.01.13 |