문제 보기 · 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단계 · 코드 흐름
- 요금표 네 값을 이름에 나눠 담는다.
- 기록마다 시각을 분으로 바꾸고, IN이면
in_time에 적고, OUT이면in_time에서 꺼내total에 더한다. in_time에 남은 차는 1,439분에 나간 것으로total에 더한다.- 차량 번호 순으로 요금을 계산해 리스트로 돌려준다.
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)\)다.
- 들어왔다 나갈 때마다 요금을 따로 매겨 더한다. 문제는 누적 시간으로 한 번만 매긴다.
- 나가지 않은 차를 빠뜨린다.
- 올림을 하지 않거나, 초과 시간이 음수일 때 음수 요금이 나온다.
-
프로그래머스 스쿨, “주차 요금 계산” (https://school.programmers.co.kr/learn/courses/30/lessons/92341), 2026-09-30 조회. ↩