프로그래머스 주차 요금 계산 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;
}

댓글