이번에 풀어본 문제는
프로그래머스 주차 요금 계산 입니다.
import java.util.*;
class Solution {
static int MIN_TIME,MIN_COST,TIME_PER,COST_PER;
public int[] solution(int[] fees, String[] records) {
int[] answer;
MIN_TIME = fees[0];
MIN_COST = fees[1];
TIME_PER = fees[2];
COST_PER = fees[3];
Map<String, Integer> parkingLot = new HashMap<>();
Map<String, Integer> total = new TreeMap<>();
for (String record : records) {
String[] values = record.split(" ");
String[] timeSplit = values[0].split(":");
String carNumber = values[1];
String status = values[2];
int time = (Integer.parseInt(timeSplit[0]) * 60) + Integer.parseInt(timeSplit[1]);
// 입차
if (status.equals("IN")) {
parkingLot.put(carNumber, time);
}
//출차
else {
int parkingTime = (time - parkingLot.get(carNumber));
total.put(carNumber, total.getOrDefault(carNumber, 0) + parkingTime);
parkingLot.remove(carNumber);
}
}
//출차 안한 차
if (!parkingLot.isEmpty()) {
int lastTime = (23 * 60) + 59;
for (String key : parkingLot.keySet()) {
int time = lastTime - parkingLot.get(key);
total.put(key, total.getOrDefault(key, 0) + time);
}
}
answer = new int[total.size()];
int idx = 0;
for (String keys : total.keySet()) {
int totalTime = total.get(keys);
int result = MIN_COST;
if (totalTime > MIN_TIME) {
totalTime -= MIN_TIME;
result += ((totalTime / TIME_PER) * COST_PER);
if (totalTime % TIME_PER > 0) result += COST_PER;
}
answer[idx++] = result;
}
return answer;
}
}
입력으로 주어진 입차, 출차 내역을 통해 주차 요금을 계산하는 문제입니다.
총 두개의 맵을 사용했습니다.
입차 여부를 확인하기 위한 parkingLot, 누적 주차 시간을 담는 total 입니다.
parkingLot의 key값은 입차된 차의 번호, value는 입차 시간입니다.
OUT 입력이 들어올 때 마다, parkingLot에 담긴 입차 시간과 비교하여 total에 주차 시간을 누적해서 더해준 후, parkingLot에서 제거해주면 출차 처리가 완료됩니다.
records에 대한 탐색이 끝나면, parkingLot에 남은 값이 있는지 확인합니다. 값이 남아있다면 입차만 하고 출차가 완료되지 않은 차량이므로, 해당 차량의 출차시간을 23:59로 처리하여 total에 반영해줍니다.
마지막으로, 정렬된 TreeMap인 total을 순차탐색하여 anser 배열을 채워주면 됩니다.
왠지 이전에 풀어본 것 같지만 재밌게 풀었던 문제입니다! 복잡한 것 같지만 생각보다 쉽게 해결했습니다.