문제
풀이
- 시간에 따른 전개와 문자열 조작 등으로 약간은 복잡할 수 있는 구현 문제였다. 그러나 차가 입차하고 출차하는 흐름 및 패턴만 파악하면 쉽게 풀 수 있었다.
- 우선, 차가 입차할 때는 입차한 시간을 저장하고 해당 차량이 나갔는지 파악할 수 있게 차량 번호를 저장하여 추적할 수 있게 한다.
- 차가 출차할 때는 입차 기록과 출차 기록을 통해 차량이 주차장에 있었던 시간을 구해주고 출차를 확인했기 때문에 추적도 제외시켜준다.
- 입출차 내역을 모두 순회했을 때 추적한 배열을 통해 23:59까지 출차하지 않은 차량의 주차 시간을 추가적으로 계산해준다.
- 이전 과정에서 구한 주차 시간을 통해 각 차량별 요금을 구해준다. 이때 차량 번호의 오름차순으로 구해준다.
소스 코드
function solution(fees, records) {
const answer = [];
const [basicTime, basicFee, unitTime, unitFee] = fees;
const in_map = {};
const total_map = {};
let in_arr = [];
for (const record of records) {
const [timeStr, num, type] = record.split(' ');
if (type === 'IN') {
in_map[num] = timeStr;
in_arr.push(num);
} else {
const [in_hour, in_min] = in_map[num].split(':').map(el => +el);
const [out_hour, out_min] = timeStr.split(':').map(el => +el);
const in_time = in_hour * 60 + in_min;
const out_time = out_hour * 60 + out_min;
const sum = out_time - in_time;
if (total_map[num]) total_map[num] += sum;
else total_map[num] = sum;
// 최악의 경우가 1000 * 1000
in_arr = in_arr.filter((el) => el !== num);
}
}
for (const num of in_arr) {
const [in_hour, in_min] = in_map[num].split(':').map(el => +el);
const [out_hour, out_min] = '23:59'.split(':').map(el => +el);
const in_time = in_hour * 60 + in_min;
const out_time = out_hour * 60 + out_min;
const sum = out_time - in_time;
if (total_map[num]) total_map[num] += sum;
else total_map[num] = sum;
}
const cars = Object.keys(total_map).sort((a, b) => a - b);
for (const car of cars) {
let cost = basicFee;
const total = total_map[car];
if (total > basicTime) {
const temp = Math.ceil((total - basicTime) / unitTime) * unitFee;
cost += temp;
}
answer.push(cost);
}
return answer;
}