[Gold IV][JAVA]백준 5710번:전기 요금

호수·2024년 5월 1일
0

JAVA 알고리즘

목록 보기
58/67
post-thumbnail
post-custom-banner

문제 풀러가기> [Gold IV]5710번:전기 요금

풀이과정

  • 상근이와 이웃의 요금 합, 요금 차를 알려주며 이때 상근이가 내야 할 금액을 구해야 한다.
  • 상근이는 항상 이웃보다 적은 요금을 낸다.
  1. 상근이가 내야 하는 금액의 범위는 0 ~ (A의 요금 / 2) 이다. - 상근이가 항상 더 적은 요금을 내기 때문이다.
  2. 상근이가 내야 하는 금액의 범위 내에서 이분탐색을 한다.

cal_watt(전기 사용량 계산)

200, 100Wah
29900 = 29700+200 , 1000Wah
4979900 = 4960000+29900+200 , 1000000 Wah

  1. 200 이하의 사용량: 전체 사용량을 2로 나눈 값을 반환
  2. 29900 이하의 사용량: 200Wh에, 그 이후의 사용량에는 3원씩 적용
  3. 4979900 이하의 사용량: 29900Wh에, 그 이후의 사용량에는 5원씩 적용하여 계산합니다.
  4. 4979901 이상의 사용량: 4979900Wh에, 그 이후의 사용량에는 7원씩 적용하여 계산합니다.

cal_price(요금 계산)

100Wh에는 2원씩 = 200, 9900Wh에는 3원씩 = 29700 , 990000Wh에는 5원씩 = 49500

  1. 1 이상 100 이하:
    • 요금: 2원
  2. 101 이상 10000 이하:
    • 요금: 200원 + (사용량 - 100) * 3원
  3. 10001 이상 1000000 이하:
    • 요금: 200원 + 29700원 + (사용량 - 10000) * 5원
  4. 1000001 이상:
    • 요금: 200원 + 29700원 + 495000원 + (사용량 - 1000000) * 7원

정답

import java.util.*;

public class Main { //유형: 이분탐색, 메모리제한: 128MB, 시간 제한: 1초
    public static void main(String argsp[]) {
        Scanner scan = new Scanner(System.in);

        while (true) {
            int a = scan.nextInt();
            int b = scan.nextInt();
            if (a == 0 && b == 0) return;

            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;
        }
    }
}
profile
Back-End개발자 성장과정 블로그🚀
post-custom-banner

0개의 댓글