-
[백준]5710: 전기 요금 - JAVA문제풀이/백준 2021. 7. 13. 21:56
[백준]5710: 전기 요금
풀이
🪑 간단한듯 조금 복잡한 수학적 사고력과 연산을 요구했던 문제였다.
문제를 정리해보자!
- 사용량에 따라 전기요금을 부과한다.
- 상근이와 이웃의 요금 합, 요금 차를 알려주며 이때 상근이가 내야 할 금액을 구해야 한다.
- 상근이는 항상 이웃보다 적은 요금을 낸다.
- 정답을 유일하다.
🔧 이제, 문제 풀이 순서 및 아이디어를 떠올려보자.
- 상근이가 내야 하는 금액의 범위는 0 ~ (A의 요금 / 2) 이다. - 상근이가 항상 더 적은 요금을 내기 때문이다.
- 상근이가 내야 하는 금액의 범위 내에서 이분탐색을 한다.
🔹 상근이가 내야 하는 금액의 범위를 구한다.
- A의 요금을 구하기 위해 문제에 표시된 표를 참고하여 금액을 전달받아 사용량을 구하는 함수를 만들어 주었다.
- 반대로, 사용량을 전달받아 금액을 구하는 함수도 추가로 만들어 주었다.
🔹 상근이가 내야 하는 금액의 범위 내에서 이분탐색을 한다.
- 기준 값은 상근이가 사용한 사용량이 되며, 이분탐색을 하며 최종 사용량을 찾으면 해당 사용량만큼 사용했을 때의 금액을 구해주면 원하는 답이 된다.
- 기준 값으로 상근이가 내야 할 요금을 구해준 다음, 전체 사용량에서 기준값을 뺀 값을 활용하여 이웃이 내야 할 요금을 구해주었다.
- 이 둘의 차이가 B보다 크다면, 상근이와 이웃의 차이를 줄여줘야 하므로 기준 값의 범위를 크게해 이웃과 차이가 줄어들도록 한다.
- 이 둘의 차이가 B보다 작다면, 상근이와 이웃의 차이를 키워주여아 하므로 기준 값의 범위를 더 작게해 이웃과의 차이가 더 커지도록 한다.
- 둘의 차이가 B와 같다면 우리가 원하는 답이 되는것이다.
코드
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758import 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 == 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;}}}cs '문제풀이 > 백준' 카테고리의 다른 글
[백준]2550: 전구 - JAVA (0) 2021.07.15 [백준]20444: 색종이와 가위 - JAVA (0) 2021.07.14 [백준]20010: 악덕 영주 혜유 - JAVA (0) 2021.07.07 [백준]13392: 구간 나누기2 - JAVA (1) 2021.07.06 [백준]1042: 거짓말 - JAVA (0) 2021.07.05