주차요금계산

민태영·2023년 11월 17일
0

문제

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

요금표
기본 시간(분) 기본 요금(원) 단위 시간(분) 단위 요금(원)
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개의 댓글