주차 요금 계산

2024. 5. 29. 14:20알고리즘/카카오

2022 KAKAO BLIND RECRUITMENT

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

 

프로그래머스

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

programmers.co.kr

소요 시간 : 33분

실행 결과 : 성공


핵심 요구사항은 입출차 내역을 바탕으로 차량별 누적시간을 구한 다음 주차 요금을 계산하는 것이다.

주차 요금을 계산하기 위해서는 각 차량별 누적시간을 구해야한다.

 

차량이 In되었다면 In되었던 시간을 차량별로 저장한다.

차량이 Out되었다면 Out되었던 시간과 In된 시간의 차이를 빼서 각 차량별 누적 시간에 저장한다. 그리고 해당 차량의 In된 시간을 -1로 업데이트한다.

만약 records를 모두 순회하고 나서 In된 시간이 남았다는 것은 23:59에 Out된 것으로 판단해야한다.

그리고 차량별 누적시간을 활용해 각 차량의 주차요금을 계산하면 된다.

반환할 때는 차량번호가 오름차순으로 정렬해서 요금만 반환한다. 

 

function getParkingFees(psums, fees){
    const ret = new Map();
    const [basicTime, basicFee, partTime, partFee] = fees;
    for(const carNum of psums.keys()){
        const psumTime = psums.get(carNum);
        if(psumTime <= basicTime) ret.set(carNum, basicFee);
        else{
            const m = basicFee + Math.ceil((psumTime - basicTime)/partTime)*partFee;
            ret.set(carNum, m);
        }
    }
    return ret;
}

function getTime(str){
    const [h, m] = str.split(":").map(Number);
    return h * 60 + m;
}

function solution(fees, records) {
    const stateMap = new Map();
    const psums = new Map();
    records.forEach((elem)=>{
        const [timeStr, number, state] = elem.split(" ");
        const time = getTime(timeStr);
        if(state === 'IN') stateMap.set(number, time);
        else {
            const outTime = getTime(timeStr);
            const inTime = stateMap.get(number);
            if(psums.has(number)) psums.set(number, psums.get(number) + outTime - inTime);
            else psums.set(number, outTime - inTime);
            stateMap.set(number, -1);
        }
    });

    for(const carNum of stateMap.keys()){
        const inTime = stateMap.get(carNum);
        if(inTime !== -1){ // 이 때는 23:59에 Out 되었다고 판단
            const lastTime = getTime("23:59");
            if(psums.has(carNum)) psums.set(carNum, psums.get(carNum) + lastTime - inTime);
            else psums.set(carNum, lastTime - inTime);
        }
    }
    const parkingFees = getParkingFees(psums, fees);
    const ret = [...parkingFees.entries()];
    return ret.sort(([carNum1, fee1], [carNum2, fee2])=> Number(carNum1) - Number(carNum2))
              .map(([carNum, fee])=>fee);
}

'알고리즘 > 카카오' 카테고리의 다른 글

순위 검색 (다시 풀어보고 정리하기)  (0) 2024.05.30
거리두기 확인하기  (1) 2024.05.30
양궁 대회  (0) 2024.05.29
두 큐 합 같게 만들기  (0) 2024.05.28
이모티콘 할인행사  (0) 2024.05.28