2022 KAKAO BLIND RECRUITMENT 주차 요금 계산 파이썬

1 분 소요

2022 KAKAO BLIND RECRUITMENT 주차 요금 계산 파이썬 풀이

이번 문제는 레벨 2입니다.

접근방식

  1. 입력값을 시간, 번호, 상태로 분리합니다.
  2. In 과 out은 사실상 필요가 없습니다. 왜냐하면 어차피 시간 순서라서 발견하자마자 시간을 누적해줍니다.
  3. 예외 사항으로 만약 IN만 발견됐을 경우 23:59:59에서 빼서 시간을 계산해줍니다.
  4. IN과 OUT의 구분은 visited 리스트를 만들어 해당 차량이 이전에 주차기록이 있는지 확인시켜주고, 이를 이용해서 누적시켜줍니다
  5. 시간을 계산하면 차량 번호가 오름차순이 될 수 있도록 정렬한 후, 요금을 계산합니다.

정답코드

import math
import datetime

def hms_to_s(s):
    t = 0
    for u in s.split(':'):
        t = 60 * t + int(u)
    return t
def solution(fees, records):
    visited = [False] * len(records)
    answer = []
    split_records = []
    time_records = {}
    dateformat = '%H:%M'
    for i in records:
        split_records.append(i.split(" "))
    for i in range(0, len(split_records)):
        for j in range(i+1, len(split_records)):
            if split_records[i][1] == split_records[j][1] and visited[i] == False and visited[j] == False :
                duration = datetime.datetime.strptime(split_records[j][0], dateformat) - datetime.datetime.strptime(split_records[i][0], dateformat)
                duration = duration.total_seconds()//60
                if split_records[i][1] in time_records:
                    time_records[split_records[i][1]] += duration
                else:
                    time_records[split_records[i][1]] = duration
                visited[i] = True
                visited[j] = True
    for i, j in enumerate(visited):
        if j == False:
            extra = datetime.datetime.strptime('23:59:59', '%H:%M:%S') - datetime.datetime.strptime(split_records[i][0],dateformat)
            extra = extra.total_seconds() // 60
            if split_records[i][1] in time_records:
                time_records[split_records[i][1]] += extra
            else:
                time_records[split_records[i][1]] = extra
            visited[i]=True
    t = dict(sorted(time_records.items()))
    for i in t.keys():
        if t[i] <= fees[0]:
            answer.append(fees[1])
        else:
            answer.append(fees[1] + (math.ceil((t[i] - fees[0])/fees[2]) * fees[3]))
    return answer

for문과 if문의 무한반복으로 푼 문제였지만 datetime 모듈의 사용이 좀 더 익숙해졌고,

시간을 문자와 숫자로 자유롭게 다루는 스킬의 중요성에 대해 다시 생각하게 되었습니다.

다른 분들의 더 간결한 코드를 참고하시면 좋을 것 같습니다.

알고리즘도 모든 것과 마찬가지로 꾸준한 연습과 이해를 바탕으로 실력이 향상합니다.

Just do it & Keep steady

댓글남기기