import java.util.*;
public class Solution {
private int[] solution(int[] fees, String[] records) {
// 문제에서 제시받은 기본시간, 기본요금, 단위시간, 단위요금
int defaultTime = fees[0];
int defaultFee = fees[1];
int calTime = fees[2];
int fee = fees[3];
// 차량이 IN, OUT한 기록을 저장해놓는 Map
// 배열[0] = IN 시간
// 배열[1] = OUT 시간, OUT 기록이 없다면 null
HashMap<String, ArrayList<Integer[]>> carMap = new HashMap<>();
// 문제에서 제시받은 입출차 기록을 Map에 put
for(String record : records) {
String[] split = record.split(" ");
String time = split[0];
String[] hourMinutes = time.split(":");
// 입출차 시간을 int형으로 변환 (01:30 -> 90)
int timeToInt =
(Integer.parseInt(hourMinutes[0]) * 60)
+ Integer.parseInt(hourMinutes[1]);
String carNum = split[1];
boolean isIn = split[2].equals("IN");
// 해당차량의 입차 기록이 없다면 Map에 기본 List 생성
// 입차 기록이 있다면 해당 차량의 기록 list를 get
ArrayList<Integer[]> list = carMap.getOrDefault(carNum, new ArrayList<>());
if (isIn) {
// 입차 기록을 list에 추가후 map 업데이트
list.add(new Integer[]{timeToInt, null});
carMap.put(carNum, list);
} else {
// 출차시간 업데이트
Integer[] timeArr = list.get(list.size() - 1);
timeArr[1] = timeToInt;
}
}
// 입출차한 기록이 있는 차량번호(Map key)를 list로 만든 뒤 오름차순 정렬
ArrayList<String> carList = new ArrayList<>(carMap.keySet());
Collections.sort(carList, Comparator.comparingInt(Integer::parseInt));
int[] answer = new int[carList.size()];
int seq = 0;
// 차량번호순으로 answer에 추가
for (String car : carList) {
// 하루동안 주차한 총시간
int timeSum = 0;
// 맵에 저장해놓은 list get
ArrayList<Integer[]> timeTables = carMap.get(car);
for(int i=0; i<timeTables.size(); i++) {
Integer[] timeTableArr = timeTables.get(i);
// 출차시간 - 입차시간 계산 (출차 기록이 없다면 23:59을((60 * 24) + 59 = 1439) 기준으로 계산)
timeSum += (timeTableArr[1] == null ? 1439 - timeTableArr[0] : timeTableArr[1] - timeTableArr[0]);
}
// 단위시간을 1분이라도 초과시 단위요금 추가
double needPayTurn = Math.ceil((double) (timeSum - defaultTime) / calTime);
answer[seq] = (timeSum - defaultTime) <= 0 ? defaultFee : (int)(defaultFee + (needPayTurn * fee));
seq++;
}
return answer;
}
}
반응형
'Java > 알고리즘' 카테고리의 다른 글
[Java] 프로그래머스 Lv2 - 2018 KAKAO BLIND RECRUITMENT[1차] 프렌즈4블록 (0) | 2024.12.11 |
---|---|
[Java] 프로그래머스 Lv2 - 2018 KAKAO BLIND RECRUITMENT[3차] 파일명 정렬 (0) | 2024.12.08 |
[Java] 프로그래머스 Lv2 - 롤케이크 자르기 (0) | 2024.11.06 |
[Java] 프로그래머스 Lv2 - 모음 사전 (0) | 2024.11.03 |
[Java] 프로그래머스 Lv2 - 방문 길이 (0) | 2024.10.30 |
댓글