옌의 로그

[Algorithm] 프로그래머스 - 주차 요금 계산 본문

스터디/알고리즘

[Algorithm] 프로그래머스 - 주차 요금 계산

dev-yen 2023. 1. 20. 00:23

문제

[프로그래머스] 주차 요금 계산
(2022 KAKAO BLIND RECRUITMENT)

 

사용 알고리즘

- HASH MAP


해결방법

  • 입-출차 시간을 기록하는 carMap, 주차 시간을 기록하는 parkTime 두개의 map을 사용하여 해결
  • records 맵을 돌며 입차인 경우 (IN) carMap에 저장해주고, 출차인 경우 (OUT) carMap 에 저장된 입차 시간을 꺼내 몇 분간 주차했는지 계산하여 parkTime에 저장한다. 이때 계산에 사용된 입차기록은 carMap 에서 삭제
  • records 확인 후 carMap 에 입차 기록이 남아있는 경우 23:59에 출차한 것으로 가정 후 주차 시간 계산
    • 여기서 포인트는. . 'HH:mm' 형식으로 들어오는 시간 데이터를 H에 60을 곱해 분단위로 바꾸어 계산해 주는 것.
    • 그렇게 하지 않으려면 javascript에선 Date() 객체를 써야하므로 복잡해진다.
  • parkTime 맵을 오름차순으로 sorting 후 주차요금 계산

 

소스코드

사용언어 : javascript

function solution(fees, records) {
    let answer = [];
    let carMap = new Map(); // 입-출차 시간맵
    let parkTime = new Map(); // 주차시간 기록 맵
    
    for (let r of records) {
        let info = r.split(" ");
        if (info[2] == 'IN') { //입차인 경우 carMap에 기록
            carMap.set(info[1], info[0]); // carNum => inputTime
        } else { // 출차인 경우 주차시간 계산 후 carMap에서 삭제
            let inTime = carMap.get(info[1]);
            let inHourMin = inTime.split(":");
            let outHourMin = info[0].split(":");
            let inMin = inHourMin[0] * 60 + parseInt(inHourMin[1]);
            let outMin = outHourMin[0] * 60 + parseInt(outHourMin[1]);
            const elapsedMin = outMin - inMin; // 주차시간(분)

            if (parkTime.has(info[1])) {
                parkTime.set(info[1], parkTime.get(info[1]) + elapsedMin);
            } else {
                parkTime.set(info[1], elapsedMin);
            }
            carMap.delete(info[1]);
        }
    }
    
    for (let [carNum, inTime] of carMap) { // 출차 기록 없는 차량 체크
        let inHourMin = inTime.split(":");
        let inMin = inHourMin[0] * 60 + parseInt(inHourMin[1]);
        let outMin = 23 * 60 + 59;
        const elapsedMin = outMin - inMin;
            
        if (parkTime.has(carNum)) {
            parkTime.set(carNum, parkTime.get(carNum) + elapsedMin);
        } else {
            parkTime.set(carNum, elapsedMin);
        }
    }
    
    const sortParkMap = new Map([...parkTime].sort());

    for (let value of sortParkMap.values()) { // 주차요금 계산
        let stdTime = fees[0];
        let stdFee = fees[1];
        let unitTime = fees[2];
        let unitMoney = fees[3];
        
        if (value <= stdTime) {
            answer.push(stdFee);
        } else {
            let amount = stdFee + Math.ceil((value - stdTime) / unitTime) * unitMoney;
            answer.push(amount);
        }
    }
    
    return answer;
}

 

Map 객체 정렬하기

> https://llnote.tistory.com/656

 

[Javascript] Map 객체 정렬하는 법

@ 방법 const myMap = new Map(); myMap.set("a",3); myMap.set("c",4); myMap.set("b",1); myMap.set("d",2); // sort by value const mapSort1 = new Map([...myMap.entries()].sort((a, b) => b[1] - a[1])); console.log(mapSort1); // Map(4) {"c" => 4, "a" => 3, "d"

llnote.tistory.com

* sort by key

const sortParkMap = new Map([...parkTime].sort());

* ... 연산자 : 비구조화 할당 (destructuring assignment) 구문 

* 배열[], 혹은 객체 {} 안의 값을 편하게 꺼내 쓸 수 있는 문법

...연산자 예시

 

한줄평

Map sort 하는 부분 빼고는 크게 어려움 없는 문제였다.

Comments