Scroll indicator done
728x90

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

 

풀이

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;
    }
}

허허허

728x90

'BAEKJOON > Java' 카테고리의 다른 글

[B1991][트리 순회][java]  (0) 2024.06.01
[B20437][문자열 게임2][java]  (0) 2024.06.01
[B1654][랜선 자르기][java]  (0) 2024.06.01
[B16637][괄호 추가하기][java]  (0) 2024.06.01
[B2688][줄어들지 않아][java]  (0) 2024.06.01