level2 _ [2022 KAKAO BLIND RECRUITMENT] 주차 요금 계산

LOOPY·2022년 5월 7일
0

Programmers(연습문제)

목록 보기
63/63
function solution(fees, records) {
    let cars = [];
    
    for(let i=0; i<records.length; i++){
        let record = records[i].split(' ');
        if(record[2] == "IN"){ // 입차 기록
            cars.push({num: records[i].split(' ')[1], in:records[i].split(' ')[0], out:'', amount:0, fee: 0});
        }else{ // 출차 기록
            for(let j=cars.length-1; j>=0; j--){
                if(cars[j].num == record[1]){
                    cars[j].out = record[0];
                    break;
                }
            }            
        }
    }
    
    for(let i=0; i<cars.length; i++){ // 누적 주차 시간(분) 계산
        if(cars[i].out.length == 0) cars[i].out = "23:59" // 출차 기록이 없는 경우
        cars[i].out = Number(cars[i].out.split(':')[0])*60 +  Number(cars[i].out.split(':')[1]);
        cars[i].in = Number(cars[i].in.split(':')[0])*60 + Number(cars[i].in.split(':')[1]);
        cars[i].amount = cars[i].out - cars[i].in;
    } 
    
    for(let i=0; i<cars.length-1; i++){ // 입출차가 2번 이상인 경우 amount 누적
        for(let j=i+1; j<cars.length; j++){
            if(cars[i].num == cars[j].num){
                cars[i].amount += cars[j].amount;
                cars.splice(j--,1);
            }
        }
    }
    
    for(let i=0; i<cars.length; i++){ // 주차 요금(원) 계산 
        if(cars[i].amount <= fees[0]){ 
            cars[i].fee = fees[1];
        }else{
            cars[i].fee = fees[1] + Math.ceil((cars[i].amount - fees[0]) / fees[2]) * fees[3];
        }  
    }    
    
    return cars.sort((a,b)=>a.num-b.num).map(v=>v.fee);
}
  1. records 배열을 순회하며 cars 배열에 입출차 기록을 객체형태로 저장
  2. 출차 기록이 없는 경우 23:59로 출차 시간을 저장하고, 입차와 출차 시간을 분단위로 환산하여 누적 시간 계산
  3. 입출차 기록이 두 번 이상인 차량은 amount를 앞의 기록에 누적하고 뒤의 기록 삭제
  4. 명세에 주어진 대로 주차 요금 계산
    원래 출차를 기록함과 동시에 amount를 저장하고 이후에 입차가 다시 기록되면 입출차 기록을 초기화하여 저장하며 amount를 누적해나가는 방식으로 코딩하고자 했으나 출차기록이 없는 경우 때문에 오히려 가독성이 떨어지는 듯 해 직관적인 방식으로 조금 더 빠르게 작성하였다. 기억해뒀다가 코테 끝나고 순회의 횟수를 줄이는 방향으로 리팩토링 해봐도 좋을 듯!!!
profile
1.5년차 프론트엔드 개발자의 소소한 기록을 담습니다 :-)

0개의 댓글