ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준]5710: 전기 요금 - JAVA
    문제풀이/백준 2021. 7. 13. 21:56

    [백준]5710: 전기 요금

     

    5710번: 전기 요금

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

    www.acmicpc.net

    풀이

    🪑 간단한듯 조금 복잡한 수학적 사고력과 연산을 요구했던 문제였다.

     

    문제를 정리해보자!

    • 사용량에 따라 전기요금을 부과한다.
    • 상근이와 이웃의 요금 합, 요금 차를 알려주며 이때 상근이가 내야 할 금액을 구해야 한다.
    • 상근이는 항상 이웃보다 적은 요금을 낸다.
    • 정답을 유일하다.

     

    🔧 이제, 문제 풀이 순서 및 아이디어를 떠올려보자.

    1. 상근이가 내야 하는 금액의 범위는 0 ~ (A의 요금 / 2) 이다. - 상근이가 항상 더 적은 요금을 내기 때문이다.
    2. 상근이가 내야 하는 금액의 범위 내에서 이분탐색을 한다.

     

    🔹 상근이가 내야 하는 금액의 범위를 구한다.

    - A의 요금을 구하기 위해 문제에 표시된 표를 참고하여 금액을 전달받아 사용량을 구하는 함수를 만들어 주었다.

    - 반대로, 사용량을 전달받아 금액을 구하는 함수도 추가로 만들어 주었다.

     

    🔹 상근이가 내야 하는 금액의 범위 내에서 이분탐색을 한다.

    - 기준 값은 상근이가 사용한 사용량이 되며, 이분탐색을 하며 최종 사용량을 찾으면 해당 사용량만큼 사용했을 때의 금액을 구해주면 원하는 답이 된다.

    - 기준 값으로 상근이가 내야 할 요금을 구해준 다음, 전체 사용량에서 기준값을 뺀 값을 활용하여 이웃이 내야 할 요금을 구해주었다.

    - 이 둘의 차이가 B보다 크다면, 상근이와 이웃의 차이를 줄여줘야 하므로 기준 값의 범위를 크게해 이웃과 차이가 줄어들도록 한다.

    - 이 둘의 차이가 B보다 작다면, 상근이와 이웃의 차이를 키워주여아 하므로 기준 값의 범위를 더 작게해 이웃과의 차이가 더 커지도록 한다.

    - 둘의 차이가 B와 같다면 우리가 원하는 답이 되는것이다.

     

     

    코드

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    import java.util.*;
     
    public class Main {
     
        public static void main(String[] args) {
            Scanner scan = new Scanner(System.in);
     
            while(true) {
                int a = scan.nextInt();
                int b = scan.nextInt();
                if(a == 0 && b == 0return;
                
                int total = cal_watt(a);
                int left = 0;
                int right = total / 2;
                while(left <= right) {
                    int mid = (left + right) / 2;
     
                    int s_price = cal_price(mid); 
                    int n_price = cal_price(total - mid); 
     
                    int diff = Math.abs(s_price - n_price); 
                    if(diff < b) {
                        right = mid - 1;
                    } else if(diff > b){
                        left = mid + 1;
                    } else {
                        System.out.println(cal_price(mid));
                        break;
                    }
                }
            }
        }
     
        public static int cal_watt(int p) {
            if(p <= 200) {
                return p / 2;
            } else if(p <= 29900) {
                return (p - 200/ 3 + 100;
            } else if(p <= 4979900) {
                return (p - 29900/ 5 + 10000;
            } else {
                return (p - 4979900/ 7 + 1000000;
            }
        }
     
        public static int cal_price(int watt) {
            if(watt <= 100) {
                return watt * 2;
            } else if(watt <= 10000) {
                return 200 + (watt - 100* 3;
            } else if(watt <= 1000000) {
                return 200 + 29700 + (watt - 10000* 5;
            } else {
                return 200 + 29700 + 4950000 + (watt - 1000000* 7;
            }
        }
    }
    cs

    댓글

Designed by Tistory.