프로그래머스 주차 요금 계산 JavaScript
2023년 1월 3일
문제 풀이
00:00 부터 23:59 까지의 입/출차 내역을 바탕으로 누적 주차 시간을 계산하여 요금을 일괄로 정산하는 문제.
입력된 records에 따라 입차일 때 timeRecords (차량 번호: 입차 시각)
으로 저장.
해당 차량번호가 출찰일 때는 출차 시각과 timeRecords에 저장된 입차 시각을 timeCaculation(입차 시각, 출차 시각)
으로 계산하여 totalRecords (차량 번호: 누적 주차 시간)
에 더해주고 timeRecords에 값을 0으로 초기화해준다.
records에 어떤 차량이 입차 후 출차 기록이 없을 시 출차 시각을 '23:59'로 잡아 totalRecords에 더해준다.
마지막으로 주차창의 주차했던 차량번호의 집합인 cars를 오름차순으로 정렬한 후 해당 차량번호의 주차시간이 기본 시간보다 같거나 작을 때 기본 요금
으로, 기본 시간보다 클 경우 기본 요금 + [(누적 주차 시간 - 기본 시간) / 단위 시간(분)] * 단위 요금
으로 계산해준다.
solution.js
function solution(fees, records) {
const answer = [];
const timeRecords = {};
const totalRecords = {};
records.forEach(item => {
const [time, num, entry] = item.split(' ');;
if (entry === 'IN') {
timeRecords[num] = time;
}
else {
totalRecords[num] = (totalRecords[num] || 0) + timeCaculation(timeRecords[num], time);
timeRecords[num] = 0;
}
});
const cars = Object.keys(timeRecords).sort();
cars.forEach(car => {
if (timeRecords[car] !== 0) {
totalRecords[car] = (totalRecords[car] || 0) + timeCaculation(timeRecords[car], '23:59');
}
const time = totalRecords[car];
time <= fees[0] === true ? answer.push(fees[1]) : answer.push(fees[1] + Math.ceil((time - fees[0]) / fees[2]) * fees[3]);
})
return answer;
}
function timeCaculation(t1, t2) {
const t1X = t1.split(":");
const t2X = t2.split(":");
const t1T = Number(t1X[0]) * 60 + Number(t1X[1]);
const t2T = Number(t2X[0]) * 60 + Number(t2X[1]);
return t2T-t1T;
}