입차일 경우에
입차 시간을 기록하는 오브젝트와 사용 시간을 등록하는 오브젝트에(최초 입차일 경우) 각각 입차시간과 0을 등록하고,
출차일 경우에 입차 시간 기록 오브젝트에서 마지막 입차 시간과 현재 출차 시간을 계산해서 사용 시간을 산출 해내고 사용 시간 오브젝트에 더해주고 입차시간 오브젝트에서 지워버린다.
순환이 끝난 후에 입차 시간 오브젝트에 남아있는 차들에 대해서는 23:59 에 출차한걸로 계산하고 사용 시간에 더해준다.
function solution(fees, records) {
var answer = [];
const [defaultTime,defaultFee,overTime,overFee] = fees
const recordObj = {}
const usetimeObj = {}
for(let i=0;i<records.length;i++){
const [time,number,action] = records[i].split(" ")
const [hour,min] = time.split(":")
const timeSum = (Number(hour)*60) + Number(min)
if(action==="IN"){
recordObj[number] = timeSum
if(usetimeObj[number]===undefined) {usetimeObj[number] = 0}
}else{
const useTime = timeSum - recordObj[number]
recordObj[number] = undefined
usetimeObj[number] += useTime
}
}
// 출차 기록이 없는 경우 = recordObj에 남아있는 경우 최대 시각 기준으로 사용 시간 추가
const keys = Object.keys(usetimeObj).sort((a,b)=>Number(a)-Number(b))
const remains= Object.keys(recordObj).filter(i=>recordObj[i]>=0)
if(remains.length){
remains.forEach(i=>{
usetimeObj[i]+= 1439 - recordObj[i]
})
}
const results = keys.map(i=>{
let sum = defaultFee
const useTime = usetimeObj[i]
if(useTime-defaultTime>0){
sum += Math.ceil((useTime-defaultTime)/overTime) * overFee
}
return sum
})
return results;
}