주차 요금 계산
2024. 5. 29. 14:20ㆍ알고리즘/카카오
https://school.programmers.co.kr/learn/courses/30/lessons/92341
소요 시간 : 33분
실행 결과 : 성공
핵심 요구사항은 입출차 내역을 바탕으로 차량별 누적시간을 구한 다음 주차 요금을 계산하는 것이다.
주차 요금을 계산하기 위해서는 각 차량별 누적시간을 구해야한다.
차량이 In되었다면 In되었던 시간을 차량별로 저장한다.
차량이 Out되었다면 Out되었던 시간과 In된 시간의 차이를 빼서 각 차량별 누적 시간에 저장한다. 그리고 해당 차량의 In된 시간을 -1로 업데이트한다.
만약 records를 모두 순회하고 나서 In된 시간이 남았다는 것은 23:59에 Out된 것으로 판단해야한다.
그리고 차량별 누적시간을 활용해 각 차량의 주차요금을 계산하면 된다.
반환할 때는 차량번호가 오름차순으로 정렬해서 요금만 반환한다.
function getParkingFees(psums, fees){
const ret = new Map();
const [basicTime, basicFee, partTime, partFee] = fees;
for(const carNum of psums.keys()){
const psumTime = psums.get(carNum);
if(psumTime <= basicTime) ret.set(carNum, basicFee);
else{
const m = basicFee + Math.ceil((psumTime - basicTime)/partTime)*partFee;
ret.set(carNum, m);
}
}
return ret;
}
function getTime(str){
const [h, m] = str.split(":").map(Number);
return h * 60 + m;
}
function solution(fees, records) {
const stateMap = new Map();
const psums = new Map();
records.forEach((elem)=>{
const [timeStr, number, state] = elem.split(" ");
const time = getTime(timeStr);
if(state === 'IN') stateMap.set(number, time);
else {
const outTime = getTime(timeStr);
const inTime = stateMap.get(number);
if(psums.has(number)) psums.set(number, psums.get(number) + outTime - inTime);
else psums.set(number, outTime - inTime);
stateMap.set(number, -1);
}
});
for(const carNum of stateMap.keys()){
const inTime = stateMap.get(carNum);
if(inTime !== -1){ // 이 때는 23:59에 Out 되었다고 판단
const lastTime = getTime("23:59");
if(psums.has(carNum)) psums.set(carNum, psums.get(carNum) + lastTime - inTime);
else psums.set(carNum, lastTime - inTime);
}
}
const parkingFees = getParkingFees(psums, fees);
const ret = [...parkingFees.entries()];
return ret.sort(([carNum1, fee1], [carNum2, fee2])=> Number(carNum1) - Number(carNum2))
.map(([carNum, fee])=>fee);
}
'알고리즘 > 카카오' 카테고리의 다른 글
순위 검색 (다시 풀어보고 정리하기) (0) | 2024.05.30 |
---|---|
거리두기 확인하기 (1) | 2024.05.30 |
양궁 대회 (0) | 2024.05.29 |
두 큐 합 같게 만들기 (0) | 2024.05.28 |
이모티콘 할인행사 (0) | 2024.05.28 |