[프로그래머스] 주차 요금 계산 - javascript

김지원·2022년 2월 17일
0

coding-test

목록 보기
24/25
post-thumbnail
post-custom-banner

📖 문제링크

https://programmers.co.kr/learn/courses/30/lessons/92341

문제 설명

주차장의 요금표와 차량이 들어오고(입차) 나간(출차) 기록이 주어졌을 때, 차량별로 주차 요금을 계산하는 문제이다.
똑같은 차량이 입차하고 출차할 수 있으며 요금은 시간을 다 더한 후 한번에 계산한다.

반환값은 차량 번호가 작은 자동차부터 청구할 주차 요금을 차례대로 정수 배열에 담아서 반환한다.
필자는 이 부분을 못봐서 약간 헤맸었다..😨
입차기록만 있고 출차기록이 없는 차량은 23:59에 출차한 것으로 한다.

👨‍💻 문제풀이

필자가 푼 문제풀이

function solution(fees, records) {
    const [basicTime, basicFee, min, fee] = fees;
    const cars = {};
    const candidate = {};
    // IN했을 때 넣는거
    const lastCar = [];
    // 들어왔다가 나간 차
    const remainingCar = [];
    // 주차장에 남은 차
    
    for (let x of records) {
        let [clock, car, history] = x.split(" ");
        let [hour, min] = clock.split(":").map(Number);
        
        if (history === "IN") {
            if (!lastCar.includes(car)) {
                candidate[car] = [hour, min, 0];
                remainingCar.push(car);
                continue;
            }
            candidate[car] = [hour, min, cars[car]];
            remainingCar.push(car);
        }
        
        if (history === "OUT") {
            lastCar.push(car);
            remainingCar.splice(remainingCar.indexOf(car), 1);
            let lastIn = candidate[car];
            let time = (hour - lastIn[0]) * 60 + min - lastIn[1];
            
            if (cars.hasOwnProperty(car)) {
                cars[car] = cars[car] + time;
            } else {
                cars[car] = time;
            }
        }
    };
    
    for (let car of remainingCar) {
        let lastIn = candidate[car];
        let time = (23 - lastIn[0]) * 60 + 59 - lastIn[1];
        if (cars.hasOwnProperty(car)) {
                cars[car] = cars[car] + time;
        } else {
            cars[car] = time;
        }
    }
    const answer = [];
    
    for (let [car, time] of Object.entries(cars)) {
        let lastIn = candidate[car];
        basicTime >= time ? time = basicFee : time = basicFee + Math.ceil((time - basicTime) / min) * fee;
        answer.push([car, time]);
    }
    
    return answer.sort((a, b) => a[0] - b[0]).map(v => v[1]);
}

입차와 출차를 할때를 구별하여 시간을 먼저 구했다.
그 다음 cars에 key값에 차량 번호 value에 시간을 넣어주었다.

배열을 이용해 남아있는 차를 구별하고 마지막에 for문을 통해 cars 오브젝트에 넣어주었다.

그 다음 entries메서드를 이용해 시간을 비용으로 바꿔주고 차량번호에 따라 정렬 후 반환하였다.

조금 더 쉽게 풀 수 있었던 문제지만 문제지문을 잘 읽지 않아 훨씬 많이 걸렸다.

다음에는 문제 지문을 더 천천히 읽어보고 진행해야겠다.

2022.02.17

profile
backend-developer
post-custom-banner

0개의 댓글