"자동차번호" : {누적 주차 시간, 입출차기록}
function solution(fees, records) {
// 모든 차의 주차 요금 산정은 '기본 요금' + ('누적 주차 시간(분) - 기본시간(분)') / 단위시간 * 단위 요금
// 만약 누적 주차 요금이 기본 시간 이하라면, 기본 요금 청구
// < 차량 입출차 기록 >
// records를 순회 => 차량을 key로 입차, 출차 체크
// records의 요소가 입차 하고, 출차 했으면, 출차 시간과 입차 시간의 차이를 value
// 만약 다시 입차한 경우, 출차도 체크, 만약 출차 기록이 없으면 23:59에 출차한 것으로 체크
// 차량 별 누적 주차 시간(분) 해쉬맵으로 저장
const inOutMap = new Map()
records = records.map(el => el.split(' '))
records.forEach((item, idx) => {
// var start = new Date('2020-10-14 09:00:00');
// 해쉬의 형태 : "자동차번호" : {누적 주차 시간, 입출차기록}
const data = inOutMap.get(item[1]) || {time: 0, inOut: ''}
if(item[2] === 'IN') {
// 입차했음을 알림
inOutMap.set(item[1], {time: data.time, inOut: new Date(`2020-10-14 ${item[0]}:00`)})
} else {
// 출차된 시간 - 입차된 시간 계산
const diffTime = (new Date(`2020-10-14 ${item[0]}:00`).getTime() - data.inOut.getTime()) / (1000 * 60)
// 계산된 시간을 누적 주차 시간에 더하기
inOutMap.set(item[1], {time: data.time + diffTime, inOut: ''})
}
})
let inOutArr = [...inOutMap]
for(let i = 0; i < inOutArr.length; i++) {
if(inOutArr[i][1].inOut !== '') {
// 23:59와 마지막 입차시간의 차이
const diffTime = (new Date('2020-10-14 23:59:00').getTime() - inOutArr[i][1].inOut.getTime()) / (1000 * 60)
inOutArr[i][1]['time'] = inOutArr[i][1]['time'] + diffTime
}
}
inOutArr.sort((a, b) => Number(a[0]) - Number(b[0]))
// 최종 주차 요금 계산
const answer = []
inOutArr.forEach((el, idx) => {
const time = el[1].time
if(time <= fees[0]) {
answer.push(fees[1])
} else {
answer.push(fees[1] + Math.ceil((time - fees[0]) / fees[2]) * fees[3])
}
})
return answer
}
00:00부터 23:59까지의 입/출차 내역을 바탕으로 차량별 누적 주차 시간을 계산하여 요금을 일괄로 정산합니다.
위 조건을 다시 한 번 확인하고 문제 조건을 명확하게 이해했다. 즉, 기본 요금이 0원이라고 가정하면, 여러 번 기본 제공 시간 내에 출차되더라도 내는 요금은 0원이 아니라 그 날 하루 동안의 누적 주차 시간을 바탕으로 계산된다.