[프로그래머스] 주차 요금 계산

Narcoker·2022년 10월 20일
0

코딩테스트

목록 보기
52/152
post-custom-banner

문제

https://school.programmers.co.kr/learn/courses/30/lessons/92341

풀이

주차장된 상태를 나타내는 Map(key: 차번호, value: 주차한 시각) 인 parking과 주차 누적시간을 저장하는 Map(key: 차번호, value: 누적시간)인 timeLog를 선언했다.

records 배열에서 문자열을 하나씩 받아와
공백을 기준으로 split() 한다.
그렇게 되면 [주차시작시각, 차번호, 입/출차] 형태의 배열을 얻을 수 있다.

만약 입차인 경우 parking에 넣어주고
timeLog에 해당 차 번호가 없으면 차번호,0를 넣는다.

출차인 경우 calDuring() 함수를 사용하여 주차시간을 구하고
timeLog의 해당 차번호의 주차시간에 이 값을 더해주고
parking 에서 해당 차번호를 삭제한다.

출차가 안된 차가 있으면
출차시각을 23:59분으로 설정하여 주차 시간을 구하고
timeLog에서 차의 누적시간에 해당 값을 더해준다.

timeLog를 배열로 타입 변환을 해주고
이 배열을 차번호 기준으로 정렬한다.
그리고 정열된 배열에서 누적시간을 가져와
carFee 함수로 주차요금을 구하여 새 배열에 push한 값을
반환한다.

function solution(fees, records) {
    const answer = [];
    let parking = new Map();
    let timeLog = new Map();

    function calDuring(record){
        let start = parking.get(record[1]).split(':').map(Number);
        let end = record[0].split(':').map(Number);
        let during = ((end[0] * 60) + end[1]) - ((start[0] * 60) + start[1]);
        return during;
    }

    function calFee(during){
        let fee;
        if (during < fees[0]){
            fee = fees[1];
        }else
            fee = fees[1] + ( Math.ceil((during-fees[0]) / fees[2]) ) * fees[3];  
        return fee;
    }
 
    for(let i = 0; i < records.length; i++){
        let record = records[i].split(" ");
        if(record[2] === "IN"){
            parking.set(record[1],record[0])
            if(!timeLog.has(record[1]))
                timeLog.set(record[1], 0);
        }
        else{
            let during = calDuring(record);
            timeLog.set(record[1], timeLog.get(record[1]) + during)
            parking.delete(record[1]);
        }
    }

    let arrParking = [...parking]; // [입차시간, 차량번호]

    for(let i = 0; i < arrParking.length; i++){
        let during = calDuring(["23:59", arrParking[i][0]]);
        timeLog.set(arrParking[i][0], timeLog.get(arrParking[i][0]) + during)
    }
    return [...timeLog].sort((a,b)=>a[0] - b[0]).reduce((arr,value)=>{
        arr.push(calFee(value[1]));
        return arr;
    },[]);;
}
profile
열정, 끈기, 집념의 Frontend Developer
post-custom-banner

0개의 댓글