watt-hour : 사용량에 따른 전기 요금 표 ex. 10123Wh 사용 -> 30515원 내야 함
전기회사 측 >> 전기 요금을 인상하지 않고 돈을 더 벌기 위해, 사용한 전기 양을 알려주지 않고 얼마 내야 하는지 요금을 알려주는 것
a : 나 + 이웃의 사용량에 따른 요금 b : 나와 이웃의 전기 요금 차이
얼마 내야하는지 알 수 없을 때 ? 100원을 내면 사용량을 알려줌
ex. a = 1100, b = 300 총 사용량: 400Wh ( wattHour(1100) = 400 ) 상근 : 150Wh, 이웃 : 250Wh
x + y = 400 | watt(x) - watt(y) | = 300 ( x, y : 상근이와 이웃의 사용량 )
A = 2 x 100 + 3 x 300 = 1100 B = | 350 - 650 | = 300
Q. 상근이가 내야 하는 전기 요금은 ? A. 350원
코드
package com.example.algorithm.study.week11;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
// 각각의 사용량을 이분 탐색, B 값 가지고 검사
// 문제 이해 부터 한 세월 ...
public class B5710_전기요금 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
while (true) {
StringTokenizer st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
if (a == 0 && b == 0) return;
int total = calWattHour(a); // 총 사용량에 따른 총 요금
int start = 0, end = total / 2;
while (start <= end) {
int mid = (start + end) / 2;
int x = calCost(mid); // 상근이
int y = calCost(total - mid); // 이웃
int tmp = Math.abs(x - y);
if (tmp > b) start = mid + 1;
else if (tmp < b) end = mid - 1;
else {
System.out.println(calCost(mid));
break;
}
}
}
}
public static int calCost(int n) { // 사용량에 따라, 내야 할 요금
if (n <= 100) return 2 * n;
else if (n <= 10_000) return 200 + 3 * (n - 100);
else if (n <= 1_000_000) return 29_900 + 5 * (n - 10_000);
else return 4_979_900 + 7 * (n - 1_000_000);
}
public static int calWattHour(int n) { // 전기 요금에 따른 사용량
if (n <= 200) return n / 2;
else if (n <= 29_900) return (n - 200) / 3 + 100;
else if (n <= 4_979_900) return (n - 29_900) / 5 + 10_000;
else return (n - 4_979_900) / 7 + 1_000_000;
}
}