연습장/프로그래머스 문제풀이

[프로그래머스 Level 2] 주차 요금 계산 - JavaScript

Tesseractjh 2022. 9. 15. 14:49

🔗 문제 링크

https://school.programmers.co.kr/learn/courses/30/lessons/92341

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

✏️ 풀이

function solution(fees, records) {
    const [BASIC_TIME, BASIC_FEE, UNIT_TIME, UNIT_FEE] = fees;
    const AUTO_OUT_TIME = 60 * 24 - 1;
    const parkInfo = {};
    
    records.forEach(str => {
        const strings = str.split(' ');
        const [hour, minute] = strings[0].split(':').map(Number);
        const time = hour * 60 + minute;
        const number = +strings[1];
        const isIn = strings[2] === 'IN';
        
        if (!parkInfo[number]) {
            parkInfo[number] = {
                inTime: 0,
                time: 0,
                isOut: true
            };
        }
        
        const info = parkInfo[number];
        
        if (isIn) {
            info.inTime = time; 
        } else {
            info.time += time - info.inTime;
        }
        
        info.isOut = !info.isOut;
    });
    
    const sortedInfo = Object
        .entries(parkInfo)
        .sort((a, b) => a[0] - b[0])
        .map(([, value]) => value);
    
    sortedInfo.forEach((info) => {
        if (!info.isOut) {
            info.time += AUTO_OUT_TIME - info.inTime;
        }
    });
    
    const calculateFee = ({ time }) => {
        if (time <= BASIC_TIME) {
            return BASIC_FEE;
        }
        return BASIC_FEE + Math.ceil((time - BASIC_TIME) / UNIT_TIME) * UNIT_FEE;
    };
    
    return sortedInfo.map(calculateFee);
}

records를 순회하면서 문자열을 파싱하여 시간, 차량 번호, 입차 여부를 구하고, 이 정보를 parkInfo 객체에 저장한다. 입차시에는 입차 시각을 갱신하고, 출차시에는 직전 입차 시각과 비교하여 주차된 시간을 계산하여 parkInfo를 갱신한다.

 

순회가 끝난 후에도 입차되어 있는 차량은 모두 출차된 것으로 처리한다. 그 후에 parkInfo의 정보를 차량 번호를 기준으로 오름차순 정렬하고, 미리 계산해놓은 시간을 바탕으로 요금을 계산하여 반환하였다.