문제 자체는 어렵지 않았는데 구현에 시간이 좀 걸리는 문제였다.. 푸는데 40분정도 걸린 것 같다.
시간과 번호판의 자리수가 정해져 있기에 파이썬의 list indexing과 sort함수를 이용하면 쉽게 풀 수 있는 문제였다.
먼저 문제에서 봐야할 조건은 크게 두가지 였던것 같다.
첫째로 누적 주차시간을 계산하여 요금을 일괄로 정산한다는 점,
둘째로 입차 후 당일에 출차를 안할 시 23:59분에 출차로 계산한다는 점이다.
셋째로 차량 번호가 작은 자동차부터 주차요금을 배열에 담아 return해야 한다는 점이다.
이 세가지 조건을 토대로 차량번호별로 주차시간을 계산해야하고, 미리 번호판, 시간순으로 정렬이 필요하겠다는 생각을 하였다.
번호판, 시, 분 순으로 정렬한다면 in, out조건을 신경쓸 필요 없어 구현이 더 쉬워진다는 장점이 있다. 왜냐하면 번호판 순으로 정렬했기에 i번째 차와 i+1번째 차의 번호판이 같다면 그 둘은 각각 in, out일 것이기 때문이다.
만약 i번째 차와 i+1번째 차의 번호판이 다르다면 i번째 차는 입차만 한 차이므로 23:59에 나간 것으로 계산하면 된다.
또한 정렬된 채로 hash를 초기화 시키기에 누적 주차 시간을 계산 후 hash의 key순서대로 value들을 불러오면 그 key들은 차량 번호가 작은 순임이 보장되므로 추후 주차 요금을 계산할 때도 편하다.
import math
def solution(fees, records):
answer = []
dic = {}
# 번호판, 시, 분 순으로 정렬
records.sort(key=lambda x:(x[6:11], x[0:2], x[3:5]))
# dictionary 초기화
for record in records:
dic[record[6:11]] = 0
i = 0
while i < len(records):
# records 길이가 홀수일 경우 i와 i+1을 비교할 수 없고, i==len(records)-1이면 배열의 마지막 원소이므로 입차만 한 차
if i == len(records)-1:
time = (59 - int(records[i][3:5])) + (23 - int(records[i][0:2])) * 60
if time <= fees[0]:
dic[records[i][6:11]] += time
else:
dic[records[i][6:11]] += time
break
# 번호판 순으로 정렬했으므로 i와 i+1의 번호판이 같다면 각각 in, out이다.
if records[i][6:11] == records[i+1][6:11]:
time = (int(records[i+1][3:5])-int(records[i][3:5]))+(int(records[i+1][0:2])-int(records[i][0:2]))*60
if time <= fees[0]:
dic[records[i][6:11]] += time
else:
dic[records[i][6:11]] += time
i += 2
# i와 i+1의 번호판이 다르다면 i번째 차는 입차만 한 차이다. 따라서 23:59분에 출차한 것으로 계산한다.
else:
time = (59-int(records[i][3:5]))+(23-int(records[i][0:2]))*60
if time <= fees[0]:
dic[records[i][6:11]] += time
else:
dic[records[i][6:11]] += time
i += 1
for key in list(dic.keys()):
if dic[key] <= fees[0]:
answer.append(fees[1])
else:
answer.append((fees[1]+math.ceil((dic[key]-fees[0])/fees[2])*fees[3]))
return answer
'Algorithm' 카테고리의 다른 글
백준 14502번: 연구소 (javascript, DFS) (0) | 2023.03.28 |
---|---|
백준 2870번: 수학숙제 (javascript, 구현) (0) | 2023.03.25 |
프로그래머스: [3차] 압축 (파이썬, 구현) (0) | 2022.12.20 |
프로그래머스: k진수에서 소수 개수 구하기 (파이썬, 구현) (0) | 2022.12.19 |
프로그래머스: n^2 배열 자르기 (파이썬, 구현) (0) | 2022.12.19 |