2022 KAKAO BLIND RECRUITMENT
LEVEL 2
주차장의 요금표 fees
와 차량의 입출기록이 담긴 records
가 주어졌을 때, 차량별로 누적 주차시간에 대한 주차 요금을 담은 배열을 return
하는 solution
함수를 작성하시오,
fees
: [기본시간(분), 기본요금(원), 단위시간(분), 단위요금(원)]
records
의 각 요소 "시각 차량번호 IN/OUT"
형식의 문자열fees
기본시간(분)
기본요금(원)
단위시간(분)
단위요금(원)
records
records
의 길이 <= 1,000"시각 차량번호 IN/OUT"
형식의 문자열 (하나의 공백으로 구분됨)시각
: HH:MM
형식으로 00:00부터 23:58까지 주어짐 (23:59의 경우 입력으로 주어지지 않음)차량번호
: 0~9로 구성된 길이 4의 문자열 (각 차량은 고유 차량번호를 가짐)내역
: IN
(입차) 또는 OUT
(출차)records
배열을 순회하며 carsInfo
객체를 채운다.
carsInfo
는 차량번호를 key로, 해당 차량의 입출차 시간을 순서대로 담은 배열을 value로 갖는다.carsInfo
의 key
들을 담은 배열 cars
를 생성한 뒤, 오름차순으로 정렬한다.
inTime
과 outTime
을 인자로 받아 주차시간을 계산하는 함수 calcTimeDiff
를 작성한다. (출력값의 시간단위: 분)
cars
배열을 순회하며 각 차량별 누적 주차시간을 계산한 뒤, 주차요금을 구하여 answer
배열에 push
한다.
answer
배열을 return
한다.
function solution(fees, records) {
// 1. records 배열을 순회하며 carsInfo 객체를 채운다
// carsInfo = {
// '0000': ['06:00', '06:34', '18:59'],
// ...
// }
const carsInfo = {};
for (let record of records) {
const [time, car, inout] = record.split(' ');
carsInfo[car] = carsInfo[car] || [];
carsInfo[car].push(time);
}
// 2. carsInfo의 key들을 담은 배열 cars를 생성한 뒤,
// 오름차순으로 정렬한다
const cars = Object.keys(carsInfo).sort();
// 3. inTime, outTime을 인자로 받아 주차시간을 계한하는 함수 calcTimeDiff를 작성한다 (출력값의 시간단위: 분)
function calcTimeDiff(inTime, outTime = '23:59') {
const start = inTime.split(':');
const end = outTime.split(':');
const startDate = new Date(0, 0, 0, start[0], start[1], 0);
const endDate = new Date(0, 0, 0, end[0], end[1], 0);
const diff = endDate - startDate;
const minutes = Math.floor(diff / 1000 / 60);
return minutes;
}
// 4. cars 배열을 순회하며 누적 주차시간을 구한 뒤,
// 각 차량별 주차요금을 계산하여 answer배열에 push한다
const answer = [];
const [defaultTime, defaultFee, unitTime, unitFee] = fees;
for (let car of cars) {
// 4-1. 누적 주차시간 구하기
let totalTime = 0;
for (let i = 0, n = carsInfo[car].length; i < n; i += 2) {
totalTime += calcTimeDiff(carsInfo[car][i], carsInfo[car][i + 1]);
}
// 4-2. 주차요금 구하기
let totalFee = defaultFee;
if (totalTime > defaultTime) {
const units = Math.ceil((totalTime - defaultTime) / unitTime);
totalFee += unitFee * units;
}
answer.push(totalFee);
}
// 5. answer 배열을 return한다
return answer;
}