프로그래머스

[프로그래머스] 주차 요금 계산 파이썬

띵지니어 2023. 6. 1. 16:45

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 


내 코드

import math


def solution(fees, records):
    default = 1439  # 23:59
    result = {}
    answer = []

    # 차 번호순으로 정렬후 뒤집어 정렬
    lst = reversed(sorted(records, key=lambda x: int(x.split()[1])))
    for l in lst:
        i, j, k = l.split()

        m = int(i[:2]) * 60 + int(i[3:])  # 시각 -> 분

        if k == 'OUT' and not (j in result.keys()):  # 처음 들어오는 경우
            result[j] = m
        elif k == 'OUT':  # 한번이라도 들어온경우
            result[j] += m
        elif k == 'IN' and not (j in result.keys()):  # 처음 들어오는경우 (출차가 없는경우)
            result[j] = default - m
        else:  # 이미 있는 경우
            result[j] -= m

    for i, j in result.items():
        if j < fees[0]:
            answer.append(fees[1])
        else:
            answer.append(fees[1] + math.ceil((j - fees[0]) / fees[2]) * fees[3])

    answer = list(reversed(answer)) # 뒤집기

    return answer

Review

 

시간 계산은 요금계산을 편하게 하기위해 분으로 바꿔주었다.

예를 들어 a = "05:34" 는  int(a[:2])*60 + int(a[3:]) = 300 + 34 = 334

문제를 보면서 파이썬의 딕셔너리로 풀어야 겠다고 생각하였다.

 

1. 얼마나 차가 머물러있었는지 계산하기

문제를 풀고나서 다른 사람의 풀이를 보니 defaultdict을 사용한 사람이 있었다. 이 부분은 나중에 따로 포스팅 해야겠다.
defaultdict() 사용했으면 if else 문을 줄일 수 있었을 것 같다.

차 번호 순으로 정렬 후 뒤집어 정렬은 내가 생각한 것이므로 꼭 할 필요는 없다 생각한다.

정렬 결과

# 1번 테스트케이스

[   '23:00 5961 OUT',
    '22:59 5961 IN',
    '07:59 5961 OUT',
    '05:34 5961 IN',
    '19:09 0148 OUT',
    '07:59 0148 IN',
    '18:59 0000 IN',
    '06:34 0000 OUT',
    '06:00 0000 IN']
    

# 시각을 분으로 고친 결과
    m	  j    k
    1380 5961 OUT
    1379 5961 IN
    479 5961 OUT
    334 5961 IN
    1149 0148 OUT
    479 0148 IN
    1139 0000 IN
    394 0000 OUT
    360 0000 IN



 

이미 들어온 차량이 있다면 key 값으로 계산해 줄수 있지만,

처음 들어온 차량은 (나는 뒤집어서 풀었기 때문에 OUT 출차 하는 차량이 처음이다) key 값으로 접근할 수 없어서 어떻게 연산할까 생각하다가, 케이스를 나눠서 계산하였다.

    if k == 'OUT' and not (j in result.keys()):  # 처음 들어오는 경우
        result[j] = m
    elif k == 'OUT':  # 한번이라도 들어온경우
        result[j] += m

 

not (j in result.keys())  이 부분에서 처음들어온 경우를 계산 하였다.

Dictionary 에 처음 접근을 해줄때는  result[j] = m 이런식으로 정의를 해줘야한다.

이런식으로 for 문을 전부 돌고 나면

1번 테스트케이스Dictionary = {'5961': 146, '0148': 670, '0000': 334}  이렇게 된다. {'차량번호' : 머물러있는 시간}

 

result[j] = default - m 이 부분은, 입차만 있을 경우만 생각한 부분이다. ( 23:59 -> 1439 )

 

 

2. 주차요금 계산하기

이 부분은 문제에 나와있어서 그대로 짰다.

 

3. 정리

처음에 정렬을 번호순으로 한 후, 뒤집어서 정렬을 했기 때문에 마지막에 answer에 담은 리스트도 reversed를 하여 뒤집어 주었다.