파이썬 알고리즘 : 주차 요금 계산

프로그래머스 Lv. 2

2023년 10월 12일 알고리즘 문제풀이

문제 1 주차 요금 계산

문제 링크

1차 시도

나의 생각

차를 배열에 넣고 관리하려고 했는데, 그러기 위해선 index를 알고 있어야 했다. 그렇지 않으면 매번 차량 번호로 검색을 해야해서 너무 비효율적인 알고리즘이 될 것 같았다. 나는 생각을 바꿔서 차량 번호는 4자리 숫자기 때문에 1만개 짜리 배열을 만들어서 차량 번호를 index로 해주었다. 각 값은 길이가 2인 배열이였는데 입차 시간과 총 주차 시간을 넣어주었다. 총 주차 시간은 해당 차량이 여러번 나오고 들어올 수 있기 떄문에 설정했다.

records를 순회하면서 입차하는 차는 배열에 값을 추가해주고, 출차해주는 차는 시간을 int로 바꿔준 후 단위를 분으로 하여 주차 시간을 구하였다. 그리고 그 값은 2번째 값으로 저장해주고 출차하였기 때문에 첫 번째 값은 0으로 바꾸었다. records를 모두 순회하고 나면 배열을 순회하여 현재 입차 시간이 입력되있는 차량들을 찾아내고 23시 59분에 출차한 것으로 계산해서 총 주차 시간에 더해주었다. 이후 총 주차 시간이 입력되있는 것들은 모두 로직대로 계산하였다. 이렇게 하면 굳이 차량 번호로 다시 정렬할 필요가 없어서 더 편하긴 했다.

결과

정답

코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
def solution(fees, records):
    basic_time, basic_fee, per_min, per_fee = fees
    answer = []
    arr = [[0,0] for _ in range(10000)]
    time = [0]
    for i in records:
        time, num, way = i.split(' ')
        if way == 'IN':
            arr[int(num)][0]=time
        else:
            s_time = arr[int(num)][0]
            arr[int(num)][0] = 0
            s_hour, s_minute = s_time.split(':')
            hour, minute = time.split(':')
            arr[int(num)][1] += 60*(int(hour)-int(s_hour)) + (int(minute)-int(s_minute))

    for i in arr:
        if not i[0]:
            continue
        else:
            last_time = i[0]
            last_hour,last_minute = last_time.split(':')
            i[1] += (23-int(last_hour))*60 + (59-int(last_minute))

    for i in arr:
        if not i[1]:
            continue
        else:
            if i[1] <= basic_time:
                answer.append(basic_fee)
            else:
                tmp = per_fee*((i[1]-basic_time)//per_min)+basic_fee
                if (i[1]-basic_time)%per_min:
                    tmp += per_fee
                answer.append(tmp)
    return answer