반응형
1. 문제
https://school.programmers.co.kr/learn/courses/30/lessons/92341
2. 코드
이 문제는 주어진 records 배열을 계산하기 쉽게 지지고 볶아주는 것이 포인트다. 나는 객체와 해시 맵을 사용했다. 자세한 설명은 주석으로 대신한다.
function solution(fees, records) {
let newR = [],car = {}, map = new Map(), fee = [], temp = [];
// 계산하기 편하게 빈칸 기준으로 값 나눠주기(newR)
// [[차량 이름, 입출차 시각, 입/출차]...]
// 각 차량의 총 주차 시간을 저장하기 위핸 객체 만들어주기(car)
// {"차량이름" : [주차 시간1, 주차시간2...]}
for(let i=0;i<records.length;i++){
newR.push(records[i].split(" "));
if(!(records[i].split(" ")[1] in car)) car[records[i].split(" ")[1]] = [];
}
// 해시 맵을 만들어 차량 별 입출차 시간에 따른 주차 시간 계산하기
// 입차라면 해시 맵에 해당 차량 입차 시각 저장하기
// 출차라면 car에 해당 차량 주차 시간 계산하여 넣고 맵에 해당 차량 값 0으로 리셋
// (다음에 또 입차할 수 있으므로)
// 이때 temp 배열에 차량 입차하면 해당 차량 이름 넣고,
// 출차하면 해당 차량 이름 빼는 식으로 입출차 관리하기
while(newR.length){
let time = Number(newR[0][0].split(":")[0]) * 60 + Number(newR[0][0].split(":")[1]);
if(newR[0][2] === "IN") {
temp.push(newR[0][1])
map.set(newR[0][1], time);
}else{
car[newR[0][1]].push(time - map.get(newR[0][1]));
map.set(newR[0][1],0);
temp.splice(temp.indexOf(newR[0][1]),1);
}
newR.shift();
}
// 입차 기록만 있고 출차 기록이 없는 차량들을 모아 23:59까지의 주차 요금 따져서 더해주기
if(temp.length){
for(let i=0;i<temp.length;i++){
car[temp[i]].push((23 * 60 + 59) - map.get(temp[i]))
}
}
// 각 차량의 최종 요금 구하기. [차량 이름, 최종 요금] 형식으로 저장
for(let key in car){
let total = car[key].reduce((a,c) => a+=c,0) > fees[0] ? Math.ceil((car[key].reduce((a,c) => a+=c,0) - fees[0])/fees[2]) * fees[3] : 0;
fee.push([key,fees[1] + total])
total = 0;
}
// 차량 번호 오름차순으로 정렬하여 요금 값만 모은 배열 리턴하기
return fee.sort((a,b) => a[0] - b[0]).map(el => el[1]);
}
반응형
'프로그래머스 > 구현' 카테고리의 다른 글
[문자열] 프로그래머스 '스킬트리' - js (0) | 2023.04.12 |
---|---|
[문자열 & 해시맵] 프로그래머스 '오픈채팅방' (0) | 2023.04.10 |
[문자열] 프로그래머스 'n진수 게임' - js (0) | 2023.04.07 |
[문자열] 프로그래머스 '압축' - js (0) | 2023.04.06 |
[구현] 프로그래머스 '야근 지수' - js (0) | 2023.04.06 |