2022 KAKAO BLIND RECRUITMENT 주차 요금 계산 파이썬
이번 문제는 레벨 2입니다.
접근방식
- 입력값을 시간, 번호, 상태로 분리합니다.
- In 과 out은 사실상 필요가 없습니다. 왜냐하면 어차피 시간 순서라서 발견하자마자 시간을 누적해줍니다.
- 예외 사항으로 만약 IN만 발견됐을 경우 23:59:59에서 빼서 시간을 계산해줍니다.
- IN과 OUT의 구분은 visited 리스트를 만들어 해당 차량이 이전에 주차기록이 있는지 확인시켜주고, 이를 이용해서 누적시켜줍니다
- 시간을 계산하면 차량 번호가 오름차순이 될 수 있도록 정렬한 후, 요금을 계산합니다.
정답코드
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
댓글남기기