https://school.programmers.co.kr/learn/courses/30/lessons/92341
주차장된 상태를 나타내는 Map(key: 차번호, value: 주차한 시각) 인 parking과 주차 누적시간을 저장하는 Map(key: 차번호, value: 누적시간)인 timeLog를 선언했다.
records 배열에서 문자열을 하나씩 받아와
공백을 기준으로 split() 한다.
그렇게 되면[주차시작시각, 차번호, 입/출차]
형태의 배열을 얻을 수 있다.만약 입차인 경우 parking에 넣어주고
timeLog에 해당 차 번호가 없으면 차번호,0를 넣는다.출차인 경우 calDuring() 함수를 사용하여 주차시간을 구하고
timeLog의 해당 차번호의 주차시간에 이 값을 더해주고
parking 에서 해당 차번호를 삭제한다.출차가 안된 차가 있으면
출차시각을 23:59분으로 설정하여 주차 시간을 구하고
timeLog에서 차의 누적시간에 해당 값을 더해준다.timeLog를 배열로 타입 변환을 해주고
이 배열을 차번호 기준으로 정렬한다.
그리고 정열된 배열에서 누적시간을 가져와
carFee 함수로 주차요금을 구하여 새 배열에 push한 값을
반환한다.function solution(fees, records) { const answer = []; let parking = new Map(); let timeLog = new Map(); function calDuring(record){ let start = parking.get(record[1]).split(':').map(Number); let end = record[0].split(':').map(Number); let during = ((end[0] * 60) + end[1]) - ((start[0] * 60) + start[1]); return during; } function calFee(during){ let fee; if (during < fees[0]){ fee = fees[1]; }else fee = fees[1] + ( Math.ceil((during-fees[0]) / fees[2]) ) * fees[3]; return fee; } for(let i = 0; i < records.length; i++){ let record = records[i].split(" "); if(record[2] === "IN"){ parking.set(record[1],record[0]) if(!timeLog.has(record[1])) timeLog.set(record[1], 0); } else{ let during = calDuring(record); timeLog.set(record[1], timeLog.get(record[1]) + during) parking.delete(record[1]); } } let arrParking = [...parking]; // [입차시간, 차량번호] for(let i = 0; i < arrParking.length; i++){ let during = calDuring(["23:59", arrParking[i][0]]); timeLog.set(arrParking[i][0], timeLog.get(arrParking[i][0]) + during) } return [...timeLog].sort((a,b)=>a[0] - b[0]).reduce((arr,value)=>{ arr.push(calFee(value[1])); return arr; },[]);; }