문제 보기 · Level 2 · 2022 KAKAO BLIND RECRUITMENT · 정답률 62% · 푼 사람 23,362명 (2026-09-30 기준)1

문제

요금표 [기본 시간, 기본 요금, 단위 시간, 단위 요금]과 하루 동안의 입·출차 기록이 주어진다. 출차 기록이 없는 차는 23:59에 나간 것으로 본다. 요금은 차마다 하루 누적 주차 시간으로 한 번에 매긴다. 기본 시간 이하면 기본 요금만 받는다. 넘으면 초과 시간을 단위 시간으로 나눠 올림한 수만큼 단위 요금을 더한다. 차량 번호가 작은 차부터 요금을 배열로 돌려준다.

  • 기록 최대 1,000개, 시각 순으로 정렬됨
  • 차량 번호는 4자리 숫자 문자열

풀이

막히면 한 단계씩 펼친다.

필요한 개념
1단계 · 작은 예로 손으로 풀기

요금표 [60분, 1000원, 10분, 100원], 기록 [“08:00 1111 IN”, “10:15 1111 OUT”, “22:00 2222 IN”]

  • 1111: 08:00~10:15 → 135분. 기본 60분을 75분 넘었다. 75 ÷ 10 = 7.5 → 올림 8 → 1000 + 8 × 100 = 1800원
  • 2222: 나간 기록이 없으니 23:59에 나간 것으로 본다. 22:00~23:59 → 119분. 59분 넘었다 → 올림 6 → 1600원
  • 번호 순으로 [1800, 1600]

같은 차가 하루에 여러 번 들어왔다 나가면, 시간을 모두 더한 뒤 요금을 한 번만 매긴다.

2단계 · 가장 단순한 방법과 그 속도

기록이 최대 1,000개라 어떻게 해도 빠르다. 어려운 곳은 규칙 세 가지다. 시간을 합친 뒤 요금 매기기, 나가지 않은 차 처리, 올림이다.

3단계 · 핵심 아이디어

딕셔너리 두 개를 쓴다.

  • in_time: 지금 주차장 안에 있는 차 → 들어온 시각(분). IN이면 적고, OUT이면 꺼내면서 지운다.
  • total: 차 → 오늘 누적 주차 시간(분). OUT마다 (나간 시각 − 들어온 시각)을 더한다.

기록을 다 본 뒤 in_time에 남은 차는 23:59(1,439분)에 나간 것으로 계산해 더한다. 요금은 기본 요금 + 올림(초과 시간 ÷ 단위 시간) × 단위 요금이고, 초과 시간이 0 이하면 기본 요금만이다.

4단계 · 코드 흐름
  1. 요금표 네 값을 이름에 나눠 담는다.
  2. 기록마다 시각을 분으로 바꾸고, IN이면 in_time에 적고, OUT이면 in_time에서 꺼내 total에 더한다.
  3. in_time에 남은 차는 1,439분에 나간 것으로 total에 더한다.
  4. 차량 번호 순으로 요금을 계산해 리스트로 돌려준다.
5단계 · 파이썬 코드
def solution(fees, records):
    base_t, base_fee, unit_t, unit_fee = fees

    def minutes(hhmm):
        h, m = map(int, hhmm.split(":"))
        return h * 60 + m

    in_time = {}                          # 차량 → 들어온 시각
    total = {}                            # 차량 → 누적 분
    for r in records:
        t, car, kind = r.split()
        if kind == "IN":
            in_time[car] = minutes(t)
        else:
            total[car] = total.get(car, 0) + minutes(t) - in_time.pop(car)
    for car, t in in_time.items():        # 나가지 않은 차는 23:59에 나간 것으로
        total[car] = total.get(car, 0) + minutes("23:59") - t

    answer = []
    for car in sorted(total):             # 차량 번호 순
        over = max(0, total[car] - base_t)
        answer.append(base_fee + (over + unit_t - 1) // unit_t * unit_fee)
    return answer
  • in_time.pop(car): 값을 꺼내 돌려주면서 딕셔너리에서 지운다.
  • sorted(total): 딕셔너리를 정렬하면 키(차량 번호)가 정렬된다. 번호가 모두 4자리 문자열이라 글자 순이 곧 숫자 순이다. 자릿수가 같은 두 수는 처음으로 다른 자리에서 크기가 갈린다. 그 자리의 숫자가 하나만 커도, 뒷자리가 모두 9인 수보다 크다(1000 > 0999, 진법과 자릿수).
  • (over + unit_t - 1) // unit_t: 올림 나눗셈이다. over가 0이면 0이다. over를 나눗셈 정리로 q × unit_t + r(0 ≤ r < unit_t)로 쓴다. unit_t − 1을 더해도 r이 0이면 몫은 q 그대로이고, r이 1 이상일 때만 q + 1이 된다.
6단계 · 실행 추적

요금표 [180, 5000, 10, 600]

차 주차 구간 누적 초과 요금
0000 06:00~06:34 (34), 18:59~23:59 (300) 334 154 → 올림 16 5000 + 9600 = 14600
0148 07:59~19:09 670 490 → 49 5000 + 29400 = 34400
5961 05:34~07:59 (145), 22:59~23:00 (1) 146 0 5000

답은 [14600, 34400, 5000]이다.

7단계 · 복잡도와 흔한 실수

기록 R개를 한 번 보고 차량 C대를 정렬하니 \(O(R + C \log C)\)다.

  • 들어왔다 나갈 때마다 요금을 따로 매겨 더한다. 문제는 누적 시간으로 한 번만 매긴다.
  • 나가지 않은 차를 빠뜨린다.
  • 올림을 하지 않거나, 초과 시간이 음수일 때 음수 요금이 나온다.
검증: 문제의 예시 3개를 통과했고, 무작위 기록 2,000묶음에서 “1분마다 주차장 안의 차를 세어 누적 시간을 구하는” 느린 풀이와 결과가 같았다 — 07_pg92341_p1.py
  1. 프로그래머스 스쿨, “주차 요금 계산” (https://school.programmers.co.kr/learn/courses/30/lessons/92341), 2026-09-30 조회. ↩