주차장의 요금표와 차량이 들어오고(입차) 나간(출차) 기록이 주어졌을 때, 차량별로 주차 요금을 계산하려고 합니다. 아래는 하나의 예시를 나타냅니다.
기본 시간(분) | 기본 요금(원) | 단위 시간(분) | 단위 요금(원) |
---|---|---|---|
180 | 5000 | 10 | 600 |
시각(시:분) | 차량 번호 | 내역 |
---|---|---|
05:34 | 5961 | 입차 |
06:00 | 0000 | 입차 |
06:34 | 0000 | 출차 |
07:59 | 5961 | 출차 |
07:59 | 0148 | 입차 |
18:59 | 0000 | 입차 |
19:09 | 0148 | 출차 |
22:59 | 5961 | 입차 |
23:00 | 5961 | 출차 |
차량 번호 | 누적 주차 시간(분) | 주차 요금(원) |
---|---|---|
0000 | 34 + 300 = 334 | 5000 + ⌈(334 - 180) / 10⌉ x 600 = 14600 |
0148 | 670 | 5000 +⌈(670 - 180) / 10⌉x 600 = 34400 |
5961 | 145 + 1 = 146 | 5000 |
0000
번 차량은 18:59에 입차된 이후, 출차된 내역이 없습니다. 따라서, 23:59에 출차된 것으로 간주합니다.기본 시간
이하라면, 기본 요금
을 청구합니다.기본 시간
을 초과하면, 기본 요금
에 더해서, 초과한 시간에 대해서 단위 시간
마다 단위 요금
을 청구합니다.단위 시간
으로 나누어 떨어지지 않으면, 올림
합니다.⌈
a⌉
: a보다 작지 않은 최소의 정수를 의미합니다. 즉, 올림
을 의미합니다.주차 요금을 나타내는 정수 배열 fees
, 자동차의 입/출차 내역을 나타내는 문자열 배열 records
가 매개변수로 주어집니다. 차량 번호가 작은 자동차부터 청구할 주차 요금을 차례대로 정수 배열에 담아서 return 하도록 solution 함수를 완성해주세요.
fees의 길이 = 4
1 ≤ records의 길이 ≤ 1,000
fees | records | result |
---|---|---|
[180, 5000, 10, 600] | ["05:34 5961 IN", "06:00 0000 IN", "06:34 0000 OUT", "07:59 5961 OUT", "07:59 0148 IN", "18:59 0000 IN", "19:09 0148 OUT", "22:59 5961 IN", "23:00 5961 OUT"] | [14600, 34400, 5000] |
[120, 0, 60, 591] | ["16:00 3961 IN","16:00 0202 IN","18:00 3961 OUT","18:00 0202 OUT","23:58 3961 IN"] | [0, 591] |
[1, 461, 1, 10] | ["00:00 1234 IN"] | [14841] |
records
를 시간 | 차량 번호 | 행동 으로 나누어 recordsList
에 저장.
carParkingTime
은 TreeMap으로 구현하여 <차량 번호, 주차 시간>을 차량 번호 순으로 저장한다.
parkingCarList
는 주차되어 있는 차량 번호 리스트 이다.
recordsList
를 탐색하여 주차 시간을 계산한다.
carStatus
가 "OUT"
일때 그 차량 번호가 "IN"
을 한 가장 최근기록을 찾고 총 주차 시간(분)을 계산하여 carParkingTime
에 저장해준다.
parkingCarList
에 차량 번호가 남아 있다면 그 차량이 "IN"
을 한 가장 최근기록을 찾고 23:59을 마지막 시간으로 총 주차 시간(분)을 계산해준다.
주차요금은 carParkingTime
을 탐색하여
기본 요금
+ ⌈
((주차 시간
- 기본 시간
) / 단위 시간
)⌉
* 단위 요금
(주차시간
이 기본 시간
보다 작다면 기본 요금
만 청구)
의 요금을 추가해준다.
import java.util.*;
class Solution {
public int[] solution(int[] fees, String[] records) {
int[] answer = {};
int basicTime = fees[0];
int basicFee = fees[1];
int unitTime = fees[2];
int unitFee = fees[3];
ArrayList<String[]> recordsList = new ArrayList<>();
Map<Integer, Integer> carParkingTime = new TreeMap<>();
Set<Integer> parkingCarList = new HashSet<>();
for (String record : records) {
String[] splitRecord = record.split(" ");
recordsList.add(splitRecord);
}
//record 정보로 주차 시간 계산
for (int i = 0; i < recordsList.size(); i++) {
int hour = Integer.valueOf(recordsList.get(i)[0].substring(0, 2));
int minute = Integer.valueOf(recordsList.get(i)[0].substring(3, 5));
int carNumber = Integer.valueOf(recordsList.get(i)[1]);
String carStatus = recordsList.get(i)[2];
if (carStatus.equals("IN")) { //입차
parkingCarList.add(carNumber);
} else { //출차
parkingCarList.remove(carNumber);
int inHour = 0;
int inMinute = 0;
//가장 최근 입차 시간 찾기
for (int j = i - 1; 0 <= j; j--) {
if (Integer.valueOf(recordsList.get(j)[1]) == carNumber && recordsList.get(j)[2].equals("IN")) {
inHour = Integer.valueOf(recordsList.get(j)[0].substring(0, 2));
inMinute = Integer.valueOf(recordsList.get(j)[0].substring(3, 5));
break;
}
}
//주차 시간 계산
int parkingMinute = getParkingMinute(hour, minute, inHour, inMinute);
if (carParkingTime.containsKey(carNumber)) {
carParkingTime.put(carNumber, carParkingTime.get(carNumber) + parkingMinute);
} else {
carParkingTime.put(carNumber, parkingMinute);
}
}
}
//출차 하지 않은 하루가 지난 차량 주차 시간 계산
for (int carNumber : parkingCarList) {
int hour = 23;
int minute = 59;
int inHour = 0;
int inMinute = 0;
for (int i = recordsList.size() - 1; i >= 0; i--) {
if (carNumber == Integer.valueOf(recordsList.get(i)[1]) && recordsList.get(i)[2].equals("IN")) {
inHour = Integer.valueOf(recordsList.get(i)[0].substring(0, 2));
inMinute = Integer.valueOf(recordsList.get(i)[0].substring(3, 5));
break;
}
}
//주차 시간 계산
int parkingMinute = getParkingMinute(hour, minute, inHour, inMinute);
if (carParkingTime.containsKey(carNumber)) {
carParkingTime.put(carNumber, carParkingTime.get(carNumber) + parkingMinute);
} else {
carParkingTime.put(carNumber, parkingMinute);
}
}
answer = new int[carParkingTime.size()];
int answerIdx = 0;
//주차 요금 계산
for (Map.Entry<Integer, Integer> parkingTimeEntry : carParkingTime.entrySet()) {
int parkingTime = parkingTimeEntry.getValue();
int parkingUnitFee = (Math.ceil((parkingTime - basicTime) / (double) unitTime) > 0 ? (int) Math.ceil((parkingTime - basicTime) / (double) unitTime) : 0) * unitFee;
int parkingFee = basicFee + parkingUnitFee;
answer[answerIdx++] = parkingFee;
}
return answer;
}
private static int getParkingMinute(int hour, int minute, int inHour, int inMinute) {
int parkingMinute = minute >= inMinute ? (hour - inHour) * 60 + (minute - inMinute) : (hour - 1 - inHour) * 60 + (minute + 60 - inMinute);
return parkingMinute;
}
}