풀이 과정
- 내역 배열에 대해 반복
- IN이면 in 객체에 시간 담기
이때 시간은 분 단위로 바꿔서 저장
- OUT이면 in 객체에서 들어온 시간 가지고 요금 계산 후 결과 객체에 시간 누적
이때 in 객체의 키 삭제: delete
- 반복이 끝나고 in 객체에 남아 있는 값은 23:59 출차로 해서 결과 객체에 시간 누적
- 결과 객체에 대해 반복하면서 요금 계산
- 결과 객체를 배열로 변환 후 차량 번호 오름차순으로 정렬
코드
function solution([baseM, baseFee, extraM, extraFee], records) {
const objIn = {};
const result = {};
for (const record of records) {
const [time, num, flag] = record.split(' ');
const [h, m] = time.split(':').map(Number);
const v = h * 60 + m;
if (flag === 'IN') {
objIn[num] = v;
} else {
result[num] = (result[num] || 0) + v - objIn[num];
delete objIn[num];
}
}
for (const [num, inTime] of Object.entries(objIn)) {
const outTime = 23 * 60 + 59;
result[num] = (result[num] || 0) + outTime - objIn[num];
}
for (const [num, time] of Object.entries(result)) {
const duration = result[num] - baseM;
result[num] =
duration > 0
? baseFee + Math.ceil(duration / extraM) * extraFee
: baseFee;
}
return Object.entries(result)
.sort((a, b) => a[0] - b[0])
.map((e) => e[1]);
}