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