[programmers] Lv.2 주차 요금 계산 (javascript)

 

✏️ 문제 (2022 KAKAO BLIND RECRUITMENT 기출)

주차 요금을 나타내는 정수 배열 
fees
, 자동차의 입/출차 내역을 나타내는 문자열 배열 
records
가 매개변수로 주어집니다. 
차량 번호가 작은 자동차부터
 청구할 주차 요금을 차례대로 정수 배열에 담아서 return 하도록 solution 함수를 완성해주세요.
 

프로그래머스

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

programmers.co.kr

 

 

입력이 들어오면 입차하는 차인지 출차하는 차인지의 여부를 확인한다.

cur라는 객체는 현재 입차되어 있는 차들의 상태를,  result라는 객체는 차의 번호와 소요 시간을 관리한다.

입차하는 경우 cur 객체에 차의 번호와 입차 시간을 저장하고, 출차하는 경우 cur 객체에서 입차 시간을 확인한 뒤 result 객체에 현재까지의 주차 시간을 저장한 후 cur 객체에서 입차 상태를 삭제한다.

입력이 끝난 후 cur 객체를 확인하여 출차하지 않은 차가 있으면 result에 23시 59분 기준으로 계산한 소요 시간을 추가한다.

결과는 차의 번호가 작은 순서대로 출력해야 하므로 result의 객체의 키 값, 즉 차 번호를 정렬한 후 그 순서대로 주차비를 계산하여 answer로 출력한다.

 

 

function solution(fees, records) {
    let answer = [];
    var result = {};
    let cur = {};   // 현재 주차장의 상태
    
    for (let r of records) {
        // 시각, 차량 번호, 내역 순서대로 입력
        let [time, car_num, state] = r.split(" ");
        
        // 입차 시 현재 주차장 상태에 번호와 시간 등록
        if (state === "IN") {
            cur[car_num] = time;
        } else {
            // 출차 시 result에 주차 시간 저장
            let spent = Number(time.split(":")[0] * 60) + Number(time.split(":")[1]) - (Number(cur[car_num].split(":")[0] * 60) + Number(cur[car_num].split(":")[1]));
            // 처음 주차하는 차인지, 주차한 적 있는 차인지 구분
            if (car_num in result) {
                result[car_num] += spent;
            } else {
                result[car_num] = spent;
            }
            delete cur[car_num];
            
        }
        
    }
    
    // 출차를 하지 않고 남아있는 차가 있으면 소요 시간 계산 (23:59) 기준
    if (Object.keys(cur).length > 0) {
        for (let c of Object.keys(cur)) {
            let spent = 23 * 60 + 59 - (Number(cur[c].split(":")[0] * 60) + Number(cur[c].split(":")[1])); 
            if (c in result) {
                result[c] += spent;
            } else {
                result[c] = spent;
            }
        }

    }
    
    // 차 번호 순서대로 답 출력해야함
    let keys = Object.keys(result).sort();
    
    // fees 배열을 이용해 주차요금 계산
    for (let k of keys) {
        if (result[k] <= fees[0]) {
            answer.push(fees[1]);
        } else {
            answer.push(fees[1] + Math.ceil((result[k] - fees[0]) / fees[2]) *  fees[3])
        }
    }
    

    return answer;
}