https://school.programmers.co.kr/learn/courses/30/lessons/92341
단순 구현
특별한 알고리즘적 기술을 요구하지 않는 문제이다.
입력의 범 수가 많지 않고, 제한조건을 통해 특이한 형태의 입력이 없다는것이 보장되어 있다.
단순히 요구하는 기능만 구현하면 된다.
각 차량별 전체 주차 시간을 저장할 Map과 차량별 입출차 시간을 저장할 Map을 선언해주자.
// 출력 시, 차량번호는 정렬되어 있다.
Map<String, Integer> parkingTime = new TreeMap<>();
// 계산 용도로 사용, 정렬될 필요가 없다.
Map<String, Integer> parkingRecordMap = new HashMap<>();
OUT으로 마지막 입력이 주어지지 않은 차량에 대해서는 23:59
시각에 반드시 강제 출차 처리됨을 주의하자.
마지막으로 차량별 전체 주차 시간이 저장된 Map을 순회하며 가격을 계산해주자.
이때, 초과한 시간이 단위 시간으로 나누어 떨어지지 않으면, 올림하여 계산함을 주의하자.
import java.util.*;
public class Solution {
Map<String, Integer> parkingTime = new TreeMap<>();
Map<String, Integer> parkingRecordMap = new HashMap<>();
public int[] solution(int[] fees, String[] records) {
for (String record : records) {
String[] inputs = record.split(" ");
int time = getTime(inputs[0]);
if (inputs[2].equals("IN")) {
parkingRecordMap.put(inputs[1], time);
} else {
int diff = time - parkingRecordMap.get(inputs[1]);
parkingTime.put(inputs[1], parkingTime.getOrDefault(inputs[1], 0) + diff);
parkingRecordMap.remove(inputs[1]);
}
}
// 23:59에 강제 출차 처리
int last = getTime("23:59");
for (String key : parkingRecordMap.keySet()) {
int diff = last - parkingRecordMap.get(key);
parkingTime.put(key, parkingTime.getOrDefault(key, 0) + diff);
}
int[] answer = new int[parkingTime.size()];
int idx = 0;
for (String key : parkingTime.keySet()) {
int time = parkingTime.get(key);
answer[idx] += fees[1]; // 기본요금 부과
if (time > fees[0]) { // 추가요금 부과
if ((time - fees[0]) % fees[2] == 0)
answer[idx] += ((time - fees[0]) / fees[2]) * fees[3];
else
answer[idx] += ((time - fees[0] + fees[2]) / fees[2]) * fees[3];
}
idx++;
}
return answer;
}
private int getTime(String input) {
String[] split = input.split(":");
return Integer.parseInt(split[0]) * 60 + Integer.parseInt(split[1]);
}
}