주차 요금 계산기 : https://programmers.co.kr/learn/courses/30/lessons/92341
어려운 문제는 아니였다. 하지만 몇몇의 조건을 잘못 설정하고 예외처리를 하면서 시간을 많이 잡아먹고 풀어서 좀 아쉬웠던 문제랄까..
Map을 두개 사용해서 하나는 누적시간(completeMap)
, 다른 하나는 출입했을때 시간을 저장하는 용(inMap)
으로 사용했다.
차가 처음으로 들어왔을때는 inMap에 시간을 int로 변환해서 넣고 들어온 차를 저장하는 list에 저장해놓는다.
그리고 해당 차가 출차 했을때 completeMap에 출차 시간 - 입차 시간
으로 누적 시간을 저장하고 입차 list에서 해당 차를 삭제한다.
그리고 출차 기록이 없는 차는 23:59분에 출차한다는 조건이 있기 때문에 입차 list에 남아있는 차를 1439(23:59) - 입차 시간
으로 completeMap에 시간을 갱신해준다.
import java.util.*;
class Solution {
int basicTime;
int basicCost;
int perTime;
int perCost;
public int[] solution(int[] fees, String[] records) {
basicTime = fees[0];
basicCost = fees[1];
perTime = fees[2];
perCost = fees[3];
//누적 시간 저장
HashMap<String, Integer> completeMap = new HashMap<>();
//입차 시간 저장
HashMap<String, Integer> inMap = new HashMap<>();
//입차 리스트
List<String> inCarList = new ArrayList<>();
for(String record : records){
String[] rArr = record.split(" ");
int time = s2i(rArr[0]);
String number = rArr[1];
String event = rArr[2];
//입차 시 입차 시간 map에 입차 시간을 저장, 입차 리스트에 차번호 저장
if (event.equals("IN")) {
inMap.put(number, time);
inCarList.add(number);
} else {
//출차 시 누적 시간 map에 누적 시간 저장, 입차 리스트에서 차번호 제거, 입차 시간 map의 값 0으로 갱신
completeMap.put(number, completeMap.getOrDefault(number, 0) + time - inMap.get(number));
inMap.put(number, 0);
inCarList.remove(number);
}
}
int lastTime = 23 * 60 + 59;
//출차 기록이 없는 차량의 누적 시간 계산
for (String n : inCarList) {
int time = lastTime - inMap.get(n);
completeMap.put(n, completeMap.getOrDefault(n,0) + time);
}
//[0] : 차량 번호, [1] : 누적시간
int[][] carInfos = new int[completeMap.size()][2];
int idx=0;
for(String n : completeMap.keySet()){
carInfos[idx][0] = Integer.parseInt(n);
carInfos[idx][1] = completeMap.get(n);
idx++;
}
Arrays.sort(carInfos, new Comparator<int[]>(){
@Override
public int compare(int[] o1, int[]o2){
return o1[0]-o2[0];
}
});
int[] answer = new int[carInfos.length];
//차량 요금 계산
for(int i=0;i<carInfos.length;i++){
answer[i] = getCost(carInfos[i][1]);
}
return answer;
}
//차량 요금 계산
int getCost(int time){
//누적 시간이 기본 시간보다 작다면 기본 요금
if(time <= basicTime) return basicCost;
int timeCost = (time-basicTime)/perTime;
//반올림
if((time-basicTime)%perTime > 0){
timeCost+=1;
}
return (timeCost*perCost)+basicCost;
}
//string 시간 -> int 시간
int s2i(String time){
String[] t = time.split(":");
int h = Integer.parseInt(t[0])*60;
int m = Integer.parseInt(t[1]);
return h+m;
}
}