주차요금계산

강인호·2024년 5월 9일
0

알고리즘 문제풀이

목록 보기
39/39

입차일 경우에
입차 시간을 기록하는 오브젝트와 사용 시간을 등록하는 오브젝트에(최초 입차일 경우) 각각 입차시간과 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;
}

0개의 댓글