❗ 문제 설명
❗ 제한 사항
❗ 입출력 예
❗ 문제 요약
입차, 출차 기록을 통해 차량별 주차 요금을 계산해라
주의 사항
- 입차기록만 있고 출차기록이 없다면 23:59에 출차한 것으로 간주
- 기본 시간 이하라면, 기본요금 적용
- 초과한 시간이 단위 시간 단위로 떨어지지 않으면 올림 처리
이 문제를 보고 바로 차량번호와 입차와 출차의 차를 객체로 관리해야겠다는 생각이 들었다.
구현을 하는 것엔 시간이 별로 걸리지 않았는데
조건 중 입차기록만 있고 출차기록이 없을 때 23:59분에 출차한 것으로 간주한다는 조건에서 조금 막혔다.
어떻게 입차하고 출차 했는지를 관리할지 고민하는 것에 시간을 많이 썼다.
결국 해결방안으로 찾은 것이 객체를 하나 더 만드는 것이었다.
그래서 입차와 출차의 차를 관리하는 객체와 입차했는지 출차했는지 관리하는 객체,
두 개의 객체를 만들었다.
function solution(fees, records) {
const answer = [];
const car = {};
const carsInout = {};
const [basicTime, basicFee, min, fee] = fees;
for (let i = 0; i < records.length; i++) {
let [time, carNumber, inout] = records[i].split(" ");
const [hours, minutes] = time.split(':');
carsInout[carNumber] = inout;
time = 60 * Number(hours) + Number(minutes);
if (inout === "IN") {
if (!car[carNumber]) car[carNumber] = 0
car[carNumber] = time - car[carNumber];
} else if (inout === "OUT")
car[carNumber] = time - car[carNumber] ;
}
for (let [carNumber, inout] of Object.entries(carsInout)) {
if (inout === "IN") car[carNumber] = 1439 - car[carNumber];
}
for (let [carNumber, time] of Object.entries(car)) {
if (time > basicTime) {
time = Math.ceil((time - basicTime) / min) * fee + basicFee;
} else time = basicFee;
answer.push([carNumber, time]);
}
return answer.sort((a, b) => a[0] - b[0]).map(car => car[1]);
}
// 입차, 출차 기록을 통해 차량별 주차 요금을 계산해라
// 주의 사항
// 입차기록만 있고 출차기록이 없다면 23:59에 출차한것으로 간주
// 기본 시간 이하라면, 기본요금 적용
// 초과한 시간이 단위 시간 단위로 떨어지지 않으면 올림 처리
위 코드처럼 입차와 출차의 기록을 관리하는 객체를 통해 입차기록만 있다면 23:59을 분으로 만든 1439에서 해당 차량의 입출차의 차를 빼주는 것으로 구현했다.
그 후 절대값으로 만들어서 비교를 진행했다.
너무 어렵지 않으면서도 생각보다 재밌는 문제였다.
아직 map에 익숙하지 않아서 사용하지 않았는데 map을 통해서 구현하면 더 쉽게 구현할 수 있을 것 같다.