🔗 문제 링크
https://school.programmers.co.kr/learn/courses/30/lessons/92341
✏️ 풀이
function solution(fees, records) {
const [BASIC_TIME, BASIC_FEE, UNIT_TIME, UNIT_FEE] = fees;
const AUTO_OUT_TIME = 60 * 24 - 1;
const parkInfo = {};
records.forEach(str => {
const strings = str.split(' ');
const [hour, minute] = strings[0].split(':').map(Number);
const time = hour * 60 + minute;
const number = +strings[1];
const isIn = strings[2] === 'IN';
if (!parkInfo[number]) {
parkInfo[number] = {
inTime: 0,
time: 0,
isOut: true
};
}
const info = parkInfo[number];
if (isIn) {
info.inTime = time;
} else {
info.time += time - info.inTime;
}
info.isOut = !info.isOut;
});
const sortedInfo = Object
.entries(parkInfo)
.sort((a, b) => a[0] - b[0])
.map(([, value]) => value);
sortedInfo.forEach((info) => {
if (!info.isOut) {
info.time += AUTO_OUT_TIME - info.inTime;
}
});
const calculateFee = ({ time }) => {
if (time <= BASIC_TIME) {
return BASIC_FEE;
}
return BASIC_FEE + Math.ceil((time - BASIC_TIME) / UNIT_TIME) * UNIT_FEE;
};
return sortedInfo.map(calculateFee);
}
records를 순회하면서 문자열을 파싱하여 시간, 차량 번호, 입차 여부를 구하고, 이 정보를 parkInfo 객체에 저장한다. 입차시에는 입차 시각을 갱신하고, 출차시에는 직전 입차 시각과 비교하여 주차된 시간을 계산하여 parkInfo를 갱신한다.
순회가 끝난 후에도 입차되어 있는 차량은 모두 출차된 것으로 처리한다. 그 후에 parkInfo의 정보를 차량 번호를 기준으로 오름차순 정렬하고, 미리 계산해놓은 시간을 바탕으로 요금을 계산하여 반환하였다.
'연습장 > 프로그래머스 문제풀이' 카테고리의 다른 글
[프로그래머스 Level 2] 메뉴 리뉴얼 - JavaScript (0) | 2022.09.15 |
---|---|
[프로그래머스 Level 2] 튜플 - JavaScript (0) | 2022.09.15 |
[프로그래머스 Level 2] 타겟 넘버 - JavaScript (0) | 2022.07.04 |
[프로그래머스 Level 2] k진수에서 소수 개수 구하기 - JavaScript (0) | 2022.06.13 |
[프로그래머스 Level 2] n진수 게임 - JavaScript (0) | 2022.06.11 |