프로그래머스 : 2022 KAKAO BLIND RECRUITMENT 주차 요금 계산

KHW·2022년 2월 5일
0

코딩테스트

목록 보기
16/17

문제

100/100
40분 소요

문제의 의도

여러개를 생각해야한다.
1. 각각의 입차 출차에 대한 기록을 통한 누적시간 구하기
2. 그때에 입차만 하고 출차를 하지않은 차량에 대한 누적시간도 고려하기
3. 누적시간에 대한 요금 계산 하기
4. 차량의 번호에 따라 오름차순으로 요금을 배열로 출력하기

  • 총 이렇게 4가지 생각을 하고 진행했다.

실행코드

const calculateParkingFee = (fees,accumulateParkingTime)=>{
    const [basisTime,basisFee,unitTime,unitFee] = fees
    const addtionalFee = Math.ceil((accumulateParkingTime-basisTime)/unitTime)*unitFee
    if(accumulateParkingTime <= basisTime)
        return basisFee
    else
         return basisFee + addtionalFee
}

const calculateAccParkingTime = (start,end)=>{
    const [startHour,startMinute]= start.split(':')
    const [endHour,endMinute]= end.split(':')
    const parkingInTime = new Date(2020, 6, 1, startHour,startMinute);
    const parkingOutTime = new Date(2020, 6, 1, endHour,endMinute);
    return (parkingOutTime.getTime() - parkingInTime.getTime())/1000/60
}

function solution(fees, records) {
    const parkingFeeArr = [];
    const parkingTimeObj = {};
    const parkingFeeObj = {};
    let inParking = []
    // 입/출차 진행 차량 시간 계산
    records.map((record) => {
        const [time,carNumber,status] = record.split(' ')
        if(status === 'IN'){
            inParking.push({t : time,carNum : carNumber, s:status})
        }
        else{
            let start,end=time;
            inParking = (inParking.filter(({carNum,t}) => {
                if(carNumber === carNum) start = t
                return carNumber !== carNum
            }))
            const parkingTime = calculateAccParkingTime(start,end)
            parkingTimeObj[carNumber] = parkingTimeObj[carNumber] ? parkingTimeObj[carNumber] + parkingTime : parkingTime
        }
    })
    
    // 입차 후 출차 하지않은 차량 시간 계산
    inParking.map(({t,carNum,s})=>{
        const parkingTime = calculateAccParkingTime(t,"23:59")
        parkingTimeObj[carNum] = parkingTimeObj[carNum] ? parkingTimeObj[carNum] + parkingTime : parkingTime
    })
    
    // 누적 시간에 따르는 차량번호마다의 주차요금 계산 
   for (const [key, accumulateParkingTime] of Object.entries(parkingTimeObj)){
       const parkingFee = calculateParkingFee(fees,accumulateParkingTime)
       parkingFeeObj[key] = parkingFeeObj[key] ? parkingFeeObj[key] + parkingFee : parkingFee
   }
    // 객체를 배열로 변경 
    for (const [numKey, fee] of Object.entries(parkingFeeObj))
        parkingFeeArr.push({numKey : Number(numKey),fee})
    return  parkingFeeArr.sort((a,b)=>a.numKey-b.numKey).map((parkingTimeObj)=>parkingTimeObj.fee)
}

주요 포인트

우리는 parkingFeeObj를 예시로
{ '5961': 5000, '0000': 14600, '0148': 34400 } 혹은
{ '3961': 591, '0202': 0 } 이러한 형태로 받아온다.

이를 key번호의 오름차순에 따라 결과를 배열로 만들어 주기위해서
for of문을 다시 돌면서 parkingFeeArr을 만들어
[ { numKey: 5961, fee: 5000 }, { numKey: 0, fee: 14600 }, { numKey: 148, fee: 34400 } ] 혹은
[ { numKey: 3961, fee: 591 }, { numKey: 202, fee: 0 } ] 이런식으로 만들게 된다.

이제 간단하다.
배열이므로 sort를 이용해서 numKey의 값의 오름차순에 따라 정렬하고 필요한 fee만 map함수를 이용해 반환한다.

profile
나의 하루를 가능한 기억하고 즐기고 후회하지말자

0개의 댓글