😊
주차 요금 계산
March 26, 2022
문제 링크
조건
- 차량에 입차 내역만 있고 출차 내역이 없으면 23:59에 출차된 것
- 누적 주차 시간이 기본 시간 이하인 경우 -> 기본 요금
- 누적 주차 시간이 기본 시간을 초과한 경우 -> (기본요금 + 올림(누적시간 - 기본시간) / 단위시간) x 단위 요금)
입력값
- fees = 주차 요금 항목 (배열)
- records = 자동차 입/출력 내역 (배열)
출력값
- 자동차 청구 주차 요금 (배열)
- 차량 번호가 작은 자동차 순서대로 담아야됨
풀이과정
- Hashmap을 사용해 각 자동차에 대해 입차시간, 총 주차 시간을 저장
- 출차 내역이 없는 자동차들의 총 주차 시간을 계산하기 위해 입차, 출차를 동기화 하는 배열 사용
- IN인 경우 입차시간을 업데이트
- OUT인 경우 출차시간 - 입차시간을 계산해 총 주차 시간을 업데이트
- 출차 내역이 없는 자동차들의 총 주차 시간을 업데이트
- 모든 자동차의 총 주차 시간을 확인 하면서 총 주차 시간이 기본 시간 이하인 경우 기본 요금, 기본 시간을 초과한 경우 조건에서 사용된 공식을 사용해 요금 계산
- 낮은 차량 번호 순으로 정렬
코드
function solution(fees, records) {
const answer = [];
const record_hashmap = {};
const remaining_cars = [];
const [basic_min, basic_fee, unit_time, unit_fee] = fees;
records.forEach((record) => {
const [clock, car_num, status] = record.split(' ');
const [hour, min] = clock.split(':').map(Number);
let in_time = hour * 60 + min;
if (status === 'IN') {
if (!record_hashmap[car_num]) {
record_hashmap[car_num] = [in_time, 0];
} else {
record_hashmap[car_num] = [in_time, record_hashmap[car_num][1]];
}
remaining_cars.push(car_num);
} else if (status === 'OUT') {
const in_time = record_hashmap[car_num][0];
const out_time = hour * 60 + min;
const total_in_time = out_time - in_time;
remaining_cars.splice(remaining_cars.indexOf(car_num), 1);
record_hashmap[car_num][1] += total_in_time;
}
});
// 출차 내역이 없으면 23:59에 출차
for (let car_num of remaining_cars) {
const last_in_time = record_hashmap[car_num][0];
const total_in_time = 23 * 60 + 59 - last_in_time;
record_hashmap[car_num][1] += total_in_time;
}
for (const car in record_hashmap) {
const total_time = record_hashmap[car][1];
// 기본 요금 or (기본요금 + 올림(누적시간 - 기본시간) / 단위시간) x 단위 요금)
let total_fee =
total_time <= basic_min
? basic_fee
: basic_fee + Math.ceil((total_time - basic_min) / unit_time) * unit_fee;
answer.push([car, total_fee]);
}
// 차량 번호가 작은 자동차 순서대로 담아야됨
return answer.sort((a, b) => a[0] - b[0]).map((v) => v[1]);
}
😊