시작하는 중

Python 프로그래머스 - 주차 요금 계산 본문

알고리즘/프로그래머스

Python 프로그래머스 - 주차 요금 계산

싱욱 2023. 4. 2. 21:02

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

 

프로그래머스

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

programmers.co.kr

 

구현 문제이다. 지문을 잘 읽는 것이 중요하다.

 

1. 이런 문제는 입력값을 파싱해둬서 쓰기 쉽게 만들어두는 것이 중요하다. 배열을 잘 정리해두는 것도 중요하다!

2. 시간을 어떻게 다룰지도 생각해둬야한다. 나는 모든 단위를 분으로 맞췄다. 시간을 분으로 맞춘 것을 절대 분이라고 하겠다.

 

고려해야할 점

1. 차가 들어오는 번호를 구분하여 들어왔던 차인지를 생각해야한다.

2. 요금을 바로 계산할 것인지, 마지막에 계산할 것인지 생각해야한다. -> 마지막에 계산!

 

풀이

1. dct는 차량번호 : 주차한시간 을 쌍으로 갖는 딕셔너리, cars는 차량 번호이자 23:59까지 나가지 않는 차량을 알기 위함이다.

2. records를 순회

3.. record를 파싱하고 절대 분을 계산한다.

4. 만약, 들어오는 것에 대한 정보라면 cars에 번호를 append한다.

5. dct에서 번호가 이미 존재하지 않는다면 -> 절대 분을 -한 값으로 지정한다. 이유는 주차한 시간 = 나간시간 - 들어온 시간

5-1. 존재하면 지금 분에서 - 절대 분을 해준다.

6. 나가는 정보라면 dct의 차량번호를 +절대 분으로 더해주고, cars에서 해당 번호를 제거한다.

 

7. 모든 순회가 끝난 후, 나가지 않는 차량은 cars에 기록되어 있다. cars가 있는 동안 while문을 돌린다.

8. 23:59의 절대분을 구하고 23:59에 출차처리를 한다.

9. dct 순회

10. value에서 기본 요금에 대한 고정적인 절대 분을 뺀다.

11. value가 0보다 작거나 같다면, 기본 요금을 답에 append!

12. 아니고, value가 단위 시간으로 나눴을 때 딱 떨어지지 않는다면 단위 요금을 + 1만큼 더 내야하고

12-1. 딱 떨어진다면 단위 요금을 단위 시간을 기준으로 있던 만큼 더 내면 된다.

 

def solution(fees, records):
    dct = {}
    cars = []
    answer = []
    for record in records:
        record = record.split()
        tmp = list(map(int,record[0].split(':')))
        minute = tmp[0] * 60 + tmp[1]
        
        if record[2] == 'IN':
            cars.append(record[1])
            if not dct.get(record[1]):
                dct[record[1]] = -minute
            else:
                dct[record[1]] += -minute
        else:
            dct[record[1]] += minute
            cars.remove(record[1])
    while cars:
        minute = 23*60 + 59
        car = cars.pop()        
        dct[car] += minute
    for key, value in sorted(dct.items()):
        value -= fees[0]
        if value <= 0:
            answer.append(fees[1])
        else:
            if value % fees[2] != 0:
                answer.append(fees[1] + fees[3] * (value // fees[2] + 1))
            else:
                answer.append(fees[1] + fees[3] * (value // fees[2]))
    return answer