전공/프로그래머스

주차 요금 계산

yha97 2023. 10. 14. 18:34

날짜 : 2023. 10. 14

사용 언어 : python

 

문제

https://school.programmers.co.kr/learn/courses/30/lessons/92341

 

코드

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문을 돌릴 때 인덱스 변수를 어떤 것을 사용할 지 좀 더 주의해서 풀어야겠다.

 

 

참고 사이트