OUT일 경우에는 같은 차량번호의 IN을 찾아야하는데, 나는 map을 이용해서 IN의 시각을 저장해주었다.
OUT시각과 IN시각을 분 단위로 변경해준후에 map에 해당 차량번호의 주차시간 누적합을 저장해주었다.
요금 계산은 주차시간이 기본 시간보다 못미치는 경우에는 기본요금을, 초과하는 경우에는 문제에 나온대로 계산해서 추가해주었다.
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
class Solution {
public Integer getMinutes(String time) {
String[] spt = time.split(":");
Integer hours = Integer.parseInt(spt[0]);
Integer minutes = Integer.parseInt(spt[1]);
return hours * 60 + minutes;
}
class ParkingInfo {
String carNumber;
Integer fee;
public Integer getFee() {
return fee;
}
}
public int[] solution(int[] fees, String[] records) {
int minimumTime = fees[0];
int minimumFee = fees[1];
int timeUnit = fees[2];
int feeUnit = fees[3];
Map<String, String> timeRecord = new HashMap<>(); // car number, time
Map<String, Integer> parkingTimeSum = new HashMap<>(); // car number, timeSum
for (int i = 0; i < records.length; i++) {
String[] spt = records[i].split(" ");
String time = spt[0];
String carNumber = spt[1];
String order = spt[2];
if ("IN".equals(order)) {
timeRecord.put(carNumber, time);
} else if ("OUT".equals(order)) {
Integer inTime = getMinutes(timeRecord.get(carNumber));
Integer outTime = getMinutes(time);
Integer timeSum = parkingTimeSum.getOrDefault(carNumber, 0);
timeSum += (outTime - inTime);
parkingTimeSum.put(carNumber, timeSum);
timeRecord.remove(carNumber);
}
}
for (String carNumber : timeRecord.keySet()) {
Integer inTime = getMinutes(timeRecord.get(carNumber));
Integer outTime = 23 * 60 + 59;
Integer timeSum = parkingTimeSum.getOrDefault(carNumber, 0);
timeSum += (outTime - inTime);
parkingTimeSum.put(carNumber, timeSum);
}
List<ParkingInfo> parkingFees = new ArrayList<>();
for (String carNumber : parkingTimeSum.keySet()) {
ParkingInfo parkingInfo = new ParkingInfo();
parkingInfo.carNumber = carNumber;
Integer parkingTime = parkingTimeSum.get(carNumber);
Integer fee = 0;
if (parkingTime <= minimumTime) {
fee = minimumFee;
} else {
fee = minimumFee + (int) Math.ceil((parkingTime - minimumTime) / ((double) timeUnit)) * feeUnit;
}
parkingInfo.fee = fee;
parkingFees.add(parkingInfo);
}
return parkingFees.stream()
.sorted((a, b) -> a.carNumber.compareTo(b.carNumber))
.mapToInt(ParkingInfo::getFee).toArray();
}
}
프로그래머스 링크
https://programmers.co.kr/learn/courses/30/lessons/92341
반응형
'Algorithm' 카테고리의 다른 글
신고 결과 받기 - 2022 Kakao Blind Recruitment (0) | 2022.07.09 |
---|