문제
https://school.programmers.co.kr/learn/courses/30/lessons/92341
풀이
한 차량이 주차장을 여러번 방문했을 경우도 생각해야 한다.
한 번 이용했을 때의 시간들을 계산해서 리스트의 형태로 관리해야 하는 문제!
그 외에는 하라는 대로 하면 되는 문제이다. 자세한 설명은 주석 참고~̆̈
코드
function solution(fees, records) {
var answer = [];
let bill = {};
records.forEach((record) => {
// 시간, 차량번호, 상태
let [strTime, num, state] = record.split(" ");
// 문자열 시간을 숫자로 변경해주기
const time = stringToTime(strTime);
// 아직 없는 번호인 경우
if (bill[num] === undefined) {
// 들어간 시간 저장
bill[num] = [[time, false]];
} else {
// 들어가는 차량이라면 들어간 시간과 상태를 리스트에 추가
if (state === "IN") {
bill[num].push([time, false]);
} else {
// 나오는 차량인 경우
let last = bill[num].length - 1;
// 나온 시간 - 맨 마지막으로 들어갔던 시간으로 다시 저장하기
bill[num][last][0] = time - bill[num][last][0];
bill[num][last][1] = true;
}
}
});
// 객체 순회하기
const keys = Object.keys(bill);
for (let key of keys) {
let totalTime = 0;
// 주차장 이용한 총 시간 계산
bill[key].forEach((item) => {
//아직 빠져나가지 않은 차량이라면 23:59(1439 = 23*60 + 59)에 나간것으로 처리
if (!item[1]) {
item[0] = 1439 - item[0];
}
// 총 시간에 합산
totalTime += item[0];
});
// 요금계산하기
let totalFee = fees[1];
// 기본 시간을 초과했다면
if (totalTime > fees[0]) {
// 추가 요금 계산하여 합산
totalFee += Math.ceil((totalTime - fees[0]) / fees[2]) * fees[3];
}
// 차량 번호와 합산한 요금 함께 리스트에 담기
answer.push([key, totalFee]);
}
// 차량 번호가 작은 순서대로
answer.sort((a, b) => a[0] - b[0]);
// 요금만 따로 추출하기
return answer.map((a) => a[1]);
}
// 문자열 시간을 숫자로 변환하는 함수 선언
const stringToTime = (str) => {
const [hour, minute] = str.split(":");
return Number(hour) * 60 + Number(minute);
};
'Algorithm > Programmers' 카테고리의 다른 글
[Lv.2] 석유 시추 - JavaScript (2) | 2024.01.04 |
---|---|
[Lv.2] 메뉴 리뉴얼 - JavaScript (feat. combination) (0) | 2023.06.11 |
[Lv.2] 이모티콘 할인행사 - JavaScript (0) | 2023.05.08 |
[Lv.2] 과제 진행하기 - JavaScript (0) | 2023.04.22 |
[LV.2] 요격시스템 - JavaScript (0) | 2023.04.17 |
댓글