문제 설명
문제가 엄청 길다.
풀기위해서 먼저 차량번호가 낮은 순서대로, 누적시간을 알아낸뒤 계산을 하면 된다.
ㅇ 코드
public static int[] solution(int[] fees, String[] records) {
Map<String, Integer> parkingTimes = calculateParkingTime(records);
//차량번호를 낮은순으로 정리하기 위한 TreeMap<>
TreeMap<String, Integer> sortedParkingTimes = new TreeMap<>(parkingTimes);
//answer 에 누적시간만 차례로 넣기.
int[] answer = sortedParkingTimes.values().stream()
.mapToInt(Integer::intValue)
.toArray();
//누적시간 구한거에 계산식 입히기
for(int i = 0; i < answer.length; i++){
if(answer[i] <= fees[0]){
answer[i] = fees[1];
} else {
int totalTime = (int) (Math.ceil((double) (answer[i] - fees[0]) / fees[2]));
answer[i] = fees[1] + totalTime * fees[3];
}
}
return answer;
}
//주어진 records에서 split으로 시간, 차량번호, 입차or출차 구하고
//IN, OUT 기준으로 calculateDifference로 누적시간 구하는 메서드
public static Map<String, Integer> calculateParkingTime(String[] records) {
Map<String, Integer> parkingTimes = new HashMap<>();
Map<String, String> entryRecords = new HashMap<>();
Map<String, Boolean> parkingStatus = new HashMap<>();
for (String record : records) {
String[] parts = record.split(" ");
String time = parts[0];
String vehicleNumber = parts[1];
String eventType = parts[2];
if (eventType.equals("IN")) {
entryRecords.put(vehicleNumber, time);
parkingStatus.put(vehicleNumber, true);
} else if (eventType.equals("OUT")) {
String entryTime = entryRecords.get(vehicleNumber);
Boolean isParked = parkingStatus.get(vehicleNumber);
if (entryTime != null && isParked != null && isParked) {
int parkingTime = calculateTimeDifference(entryTime, time);
parkingTimes.put(vehicleNumber, parkingTimes.getOrDefault(vehicleNumber, 0) + parkingTime);
entryRecords.remove(vehicleNumber);
parkingStatus.put(vehicleNumber, false);
}
}
//IN만 있고 OUT은 없을때, 23:59에 출차 했다고 치고 계산
for (Map.Entry<String, String> entry : entryRecords.entrySet()) {
int parkingTime = calculateTimeDifference(entry.getValue(), "23:59");
parkingTimes.put(entry.getKey(), parkingTimes.getOrDefault(entry.getKey(), 0) + parkingTime);
}
return parkingTimes;
}
//얼마나 주차했는지 시간계산 해주는 메서드
//calculateTimeDifference("13:00","13:01") 하면 1반환
public static int calculateTimeDifference(String startTime, String endTime) {
String[] startParts = startTime.split(":");
String[] endParts = endTime.split(":");
int startHour = Integer.parseInt(startParts[0]);
int startMinute = Integer.parseInt(startParts[1]);
int endHour = Integer.parseInt(endParts[0]);
int endMinute = Integer.parseInt(endParts[1]);
int totalStartMinutes = startHour * 60 + startMinute;
int totalEndMinutes = endHour * 60 + endMinute;
return totalEndMinutes - totalStartMinutes;
}
'Java > 알고리즘' 카테고리의 다른 글
뒤에 있는 큰 수 찾기 (0) | 2023.11.22 |
---|---|
주식 가격 (1) | 2023.11.21 |
더맵게(Priority Queue, Min Heap) (0) | 2023.11.02 |
모음사전 (0) | 2023.11.01 |
알고리즘 공부(3) - 완전탐색을 알아보자 (1) | 2023.10.31 |