주차장의 요금표와 차량이 들어오고(입차) 나간(출차) 기록이 주어졌을 때, 차량별로 주차 요금을 계산하려고 합니다. 아래는 하나의 예시를 나타냅니다.
요금표
기본 시간(분) 기본 요금(원) 단위 시간(분) 단위 요금(원)
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 출차
누적주차시간과 차량번호를 짝지어서 어떻게 저장을 할까? => Map객체를 쓰기로 결정
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())
}