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

Gaanii·2025년 5월 19일

Problem Solving

목록 보기
202/210
post-thumbnail

아래 프로그래머스 로고를 클릭하면 해당 문제로 이동합니다 😀

프로그래머스로고



풀이과정


이 문제의 풀이과정은 이 흐름을 따라가면 된다 !

  • parking: typeIN인 경우 각 차량의 입차 시간을 저장, OUT인 경우 저장되어있던 입차시간 꺼내와서 누적시간 계산
  • totalTime: 각 차량의 누적 주차 시간을 저장
  • 입차만 하고 출차하지 않은 차량 → 23:59 출차로 간주해서 계산
  • 누적 시간이 기본 시간 이하면 기본 요금만 부과
  • 초과 시 → ceil((time - 기본 시간) / 단위 시간) * 단위 요금 적용

코드


1. Python

import math
from collections import defaultdict

def solution(fees, records):
    basic_time, basic_rate, unit_time, unit_rate = fees
    parking = {}
    total_time = defaultdict(int)

    for record in records:
        time_str, car, status = record.split()
        h, m = map(int, time_str.split(":"))
        minutes = h * 60 + m

        if status == "IN":
            parking[car] = minutes
        else:
            total_time[car] += minutes - parking.pop(car)

    for car, in_time in parking.items():
        total_time[car] += 1439 - in_time 

    result = []
    for car in sorted(total_time):
        time = total_time[car]
        if time <= basic_time:
            result.append(basic_rate)
        else:
            extra = math.ceil((time - basic_time) / unit_time)
            result.append(basic_rate + extra * unit_rate)

    return result

2. JS

function solution(fees, records) {
    const [basicTime, basicRate, unitTime, unitRate] = fees;
    
    let parking = new Map();
    let totalTime = new Map();
    
    for(const record of records){
        const [timeStr, car, type] = record.split(" ");
        const [h, m] = timeStr.split(":").map(Number);
        const time = 60*h + m;
        
        if(type === "IN"){
            parking.set(car, time);
        } else {
            const inTime = parking.get(car);
            const duration = time - inTime;
            totalTime.set(car, (totalTime.get(car) || 0) + duration);
            parking.delete(car);
        }
    }
    
    for(const [car, inTime] of parking.entries()){
        const duration = 1439 - inTime;
        totalTime.set(car, (totalTime.get(car) || 0) + duration);
    }
    
    const result = Array.from(totalTime.entries())
    .sort((a, b) => a[0].localeCompare(b[0]))
    .map(([car, time]) => {
        if(time <= basicTime) return basicRate;
        return basicRate + Math.ceil((time - basicTime) / unitTime) * unitRate;
    });
    
    return result;
}


결과


정답

0개의 댓글