주차요금계산

민태영·2023년 11월 17일

문제

주차장의 요금표와 차량이 들어오고(입차) 나간(출차) 기록이 주어졌을 때, 차량별로 주차 요금을 계산하려고 합니다. 아래는 하나의 예시를 나타냅니다.

요금표
기본 시간(분) 기본 요금(원) 단위 시간(분) 단위 요금(원)
180 5000 10 600

입/출차 기록
시각(시:분) 차량 번호 내역
05:34 5961 입차
06:00 0000 입차
06:34 0000 출차
07:59 5961 출차
07:59 0148 입차
18:59 0000 입차
19:09 0148 출차
22:59 5961 입차
23:00 5961 출차

고민

  1. 누적주차시간과 차량번호를 짝지어서 어떻게 저장을 할까? => Map객체를 쓰기로 결정

  2. Map객체를 오름차순으로 어떻게 정렬할까?
    => ascFunc함수를 만들어 객체로 바꾸어서 sort메서드를 활용

문제

2번째 테스트케이스의 3961번 차량의 최종요금이 9.51이 계속 나오는 문제

최종주차요금 공식은 기본요금 +⌈(누적주차시간 - 기본시간) / 단위시간⌉x 단위요금으로 다른 답은 맞게 나오는데 해당 케이스만 소수점대로 나오는것이다!

원인

(누적주차시간 - 기본시간) / 단위시간에서 0.대가 되기때문에 오류가 난것이었다!

해결

소수점아래의 숫자가 5이하여도 올림받을 수 있게 Math.ceil을 이용하였다

fees[1] + Math.ceil((sumMinute - fees[0]) / fees[2])  * fees[3]

최종코드

function solution(fees, records) {
    var answer = [];
    let map = new Map()
    for(let idx1 = 0; idx1 < records.length; idx1++) {
        if(!map.has(`${records[idx1].split(" ")[1]}`)) {
            map.set(`${records[idx1].split(" ")[1]}`, {"IN": "", "totalTime": 0})  
        } 
        if(`${records[idx1].split(" ")[2]}` === "IN") {
            const totalTime = map.get(`${records[idx1].split(" ")[1]}`)["totalTime"]
            map.set(`${records[idx1].split(" ")[1]}`, {"IN": records[idx1].split(" ")[0], "totalTime": totalTime})
        } else {
            const outTime = records[idx1].split(" ")[0]
            const inTime = map.get(`${records[idx1].split(" ")[1]}`)['IN']
            const calcTime = changeMin(inTime, outTime)
            let totalMinute = map.get(`${records[idx1].split(" ")[1]}`)['totalTime'] + calcTime
            map.set(`${records[idx1].split(" ")[1]}`, { "totalTime": totalMinute})
        }
    }
    
//  Map객체에 In이 있으면 23:59분으로 출차 간주
    for(let key of map.keys()) {
        if(map.get(`${key}`)["IN"]) {
            const minute = map.get(`${key}`)["totalTime"]
            const totalMinute = changeMin(map.get(`${key}`)["IN"], "23:59")
            map.set(`${key}`, {"totalTime": totalMinute + minute}) 
        }
    }
    
    const ascMap = ascFunc(map)
    for(let [key, value] of ascMap) {
        let count = 0;
        answer.push(calcParkingFee(fees, value["totalTime"]))
    }

    return answer;
}


// 최종 주차요금 
function calcParkingFee(fees, sumMinute) {
    let result;
 
    if(sumMinute > fees[0]) {
//      소수점은 버리고 무조건 올림을 해야 제대로 된 계산이 된다. 
        result = fees[1] + Math.ceil((sumMinute - fees[0]) / fees[2])  * fees[3]
        
    } else {
        result = fees[1]
    }
    return result;
}

// 시를 분으로
function changeMin(inTime, outTime) {
    const inMinute = (parseInt(inTime.split(":")[0]) * 60) + parseInt(inTime.split(":")[1])
    const outMinute = (parseInt(outTime.split(":")[0]) * 60) + parseInt(outTime.split(":")[1])
    return outMinute - inMinute
}

// 오름차순 정렬하기
function ascFunc(map) {
    let ascArr = [...map]
    return new Map(ascArr.sort())
}
profile
꿈을 꾸는 개발자

0개의 댓글