100/100
40분 소요
여러개를 생각해야한다.
1. 각각의 입차 출차에 대한 기록을 통한 누적시간 구하기
2. 그때에 입차만 하고 출차를 하지않은 차량에 대한 누적시간도 고려하기
3. 누적시간에 대한 요금 계산 하기
4. 차량의 번호에 따라 오름차순으로 요금을 배열로 출력하기
const calculateParkingFee = (fees,accumulateParkingTime)=>{
const [basisTime,basisFee,unitTime,unitFee] = fees
const addtionalFee = Math.ceil((accumulateParkingTime-basisTime)/unitTime)*unitFee
if(accumulateParkingTime <= basisTime)
return basisFee
else
return basisFee + addtionalFee
}
const calculateAccParkingTime = (start,end)=>{
const [startHour,startMinute]= start.split(':')
const [endHour,endMinute]= end.split(':')
const parkingInTime = new Date(2020, 6, 1, startHour,startMinute);
const parkingOutTime = new Date(2020, 6, 1, endHour,endMinute);
return (parkingOutTime.getTime() - parkingInTime.getTime())/1000/60
}
function solution(fees, records) {
const parkingFeeArr = [];
const parkingTimeObj = {};
const parkingFeeObj = {};
let inParking = []
// 입/출차 진행 차량 시간 계산
records.map((record) => {
const [time,carNumber,status] = record.split(' ')
if(status === 'IN'){
inParking.push({t : time,carNum : carNumber, s:status})
}
else{
let start,end=time;
inParking = (inParking.filter(({carNum,t}) => {
if(carNumber === carNum) start = t
return carNumber !== carNum
}))
const parkingTime = calculateAccParkingTime(start,end)
parkingTimeObj[carNumber] = parkingTimeObj[carNumber] ? parkingTimeObj[carNumber] + parkingTime : parkingTime
}
})
// 입차 후 출차 하지않은 차량 시간 계산
inParking.map(({t,carNum,s})=>{
const parkingTime = calculateAccParkingTime(t,"23:59")
parkingTimeObj[carNum] = parkingTimeObj[carNum] ? parkingTimeObj[carNum] + parkingTime : parkingTime
})
// 누적 시간에 따르는 차량번호마다의 주차요금 계산
for (const [key, accumulateParkingTime] of Object.entries(parkingTimeObj)){
const parkingFee = calculateParkingFee(fees,accumulateParkingTime)
parkingFeeObj[key] = parkingFeeObj[key] ? parkingFeeObj[key] + parkingFee : parkingFee
}
// 객체를 배열로 변경
for (const [numKey, fee] of Object.entries(parkingFeeObj))
parkingFeeArr.push({numKey : Number(numKey),fee})
return parkingFeeArr.sort((a,b)=>a.numKey-b.numKey).map((parkingTimeObj)=>parkingTimeObj.fee)
}
우리는
parkingFeeObj
를 예시로
{ '5961': 5000, '0000': 14600, '0148': 34400 }
혹은
{ '3961': 591, '0202': 0 }
이러한 형태로 받아온다.
이를 key번호의 오름차순에 따라 결과를 배열로 만들어 주기위해서
for of문을 다시 돌면서parkingFeeArr
을 만들어
[ { numKey: 5961, fee: 5000 }, { numKey: 0, fee: 14600 }, { numKey: 148, fee: 34400 } ]
혹은
[ { numKey: 3961, fee: 591 }, { numKey: 202, fee: 0 } ]
이런식으로 만들게 된다.
이제 간단하다.
배열이므로 sort를 이용해서numKey
의 값의 오름차순에 따라 정렬하고 필요한 fee만 map함수를 이용해 반환한다.