주차장의 요금표와 차량이 들어오고(입차) 나간(출차) 기록이 주어졌을 때, 차량별로 주차 요금을 계산하려고 합니다. 아래는 하나의 예시를 나타냅니다.
주차 요금을 나타내는 정수 배열 fees, 자동차의 입/출차 내역을 나타내는 문자열 배열 records가 매개변수로 주어집니다. 차량 번호가 작은 자동차부터 청구할 주차 요금을 차례대로 정수 배열에 담아서 return 하도록 solution 함수를 완성해주세요.
function solution(fees, records) {
const record = {}; // in out 처리 (in만했을때 값 처리)
const times = {}; // 총 주차시간
const totalTimes = {}; // 요금 정산
for (let i = 0; i < records.length; i++) {
let [time, number, inout] = records[i].split(" ");
// time을 시간으로 변환해준다.
let totalTime = 0;
time = time.split(":").map(Number);
totalTime += time[0] * 60 + time[1];
// IN일때는 record에 언제 들어왔는지 시간을 넣어주고
if (inout === "IN") {
record[number] = totalTime
;
// OUT일떄는 나간시간에서 들어왔던 시간을 빼서 times에 넣어준다
} else if (inout === "OUT") {
const parkingTime = totalTime - record[number];
// times[number] 에 값이 이미 있으면 += 더해준다
if (times[number]) {
times[number] += parkingTime;
} else {
times[number] = parkingTime;
}
// OUT을 했으면 in을 넣었던 객체를 -1로 해준다 (처음에는 0으로 했다가 00:00이 있었다)
record[number] = -1;
}
}
// 나간 기록이 없으면 뺴주자
// record에 값이 -1이 아니면 나간 기록이 없는거다 2400에서 빼준 값을 times에 추가해주자
for (const key in record) {
if (record.hasOwnProperty(key)) {
if (record[key] !== -1) {
record[key] = 24*60 - record[key] -1;
if(times[key]){
times[key] += record[key]
}else{
times[key] = record[key]
}
}
}
}
// 기본 시간(분) 기본 요금(원) 단위 시간(분) 단위 요금(원)
for(let time in times){
// 기본 시간보다 작으면 기본요금넣어주고
if (times[time] <= fees[0]){
totalTimes[time] = fees[1];
}else{
// 그렇지 않으면 기본시간을 뺴주고, 기본요금을 더한다
// 남은시간을 단위 시간으로 나눈뒤 단위 요금을 곱해준다
times[time] -= fees[0];
totalTimes[time] = fees[1];
totalTimes[time] += Math.ceil(times[time]/fees[2]) * fees[3]
}
}
// 차량 번호가 작은 자동차부터 정렬
const sortedtotalTimes = Object.keys(totalTimes).sort();
return sortedtotalTimes.reduce((acc,cur) => {
acc.push(totalTimes[cur])
return acc
},[]);
}