전공/프로그래머스
주차 요금 계산
yha97
2023. 10. 14. 18:34
날짜 : 2023. 10. 14
사용 언어 : python
문제
코드
def solution(fees, records):
check = dict() # 입차, 출차 체크
parktime = dict() # 차량별 주차시간
res = dict()
for i in range(len(records)):
tmp, num, inout = records[i].split()
hh, mm = tmp.split(":")
time = int(hh) * 60 + int(mm)
records[i] = [time, num, inout]
if num not in check:
check[num] = -1
parktime[num] = 0
res[num] = 0
for i in range(len(records)):
time, num, inout = records[i]
if inout == "IN": # 입차
check[num] = time # 입차시간 저장
continue
# 출차
parktime[num] += (time - check[num]) # 주차시간 저장
check[num] = -1 # 출차완료
# 자정 이후(출차내역 없음)
for i in list(check.keys()):
if check[i] != -1:
parktime[i] += (23*60 + 59) - check[i] # 23:59 출차 간주
check[i] = -1
for num in list(parktime.keys()):
tmp = fees[1] # 기본요금
parktime[num] -= fees[0] # 기본시간 차감
if parktime[num] > 0: # 추가요금 발생
t = parktime[num]
tmp += (t // fees[2]) * fees[3] # 추가요금 반영
t -= t // fees[2] * fees[2]
if t > 0 :
tmp += fees[3]
res[num] = tmp
temp = list(res.keys())
temp.sort()
result = list()
for i in temp:
result.append(res[i])
return result
풀이
- 각 시간을 분단위로 저장하여 전처리를 실행하고, 실행하면서 입/출차를 저장할 딕셔너리, 각 차량별 총 주차시간을 저장할 딕셔너리, 총 요금을 저장할 딕셔너리를 각각 생성한다.
- 입차가 되어있는 경우 check[차번호]의 값은 입차한 시간이고, 출차했거나 아직 입차하지 않았다면 -1로 저장한다.
- 이후 각 기록에 대해 반복문을 돌려서 문제를 풀이한다.
- 입차한 경우 입차기록을 저장하고, 출차한 경우에는 출차한 시간과 입/출차 여부를 최신화한다.
- 그리고 해당 반복문을 끝내고 아직 출차하지 않은 케이스가 있을 수 있기 때문에 check 딕셔너리에 대해 값이 -1이 아닌 케이스를 걸러내어 또다시 입차시간을 최신화한다.
- 그리고 주차시간에 대해 기본요금과 추가요금을 반영하여 각 차량에 대해 총 요금을 계산하여 저장한다.
- 그 다음 차 번호에 대해 오름차순으로 정렬 후 결과를 위한 리스트에 각각 삽입하여 리턴한다.
알게된 점
- 올림 함수를 알지 못했다는 점과 딕셔너리 변수를 사용하는 과정에서 헷갈리는 바람에 많은 시간을 허비했다.
- for문을 돌릴 때 인덱스 변수를 어떤 것을 사용할 지 좀 더 주의해서 풀어야겠다.
참고 사이트
-