일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- LEVEL2
- 구현
- glod4
- 백준
- mysql
- Kakao
- gold2
- HTML
- Gold4
- 배포
- glod5
- leetcode
- CSS
- spring
- jpa
- siver3
- 개념
- AWS
- java
- leetcode 69
- LCS
- 백엔드
- LEVEL1
- 오류
- gold5
- 9252
- Thymeleaf
- error
- 프로그래머스
- PYTHON
- Today
- Total
이 험난한 세상에서어어~
주차 요금 계산 본문
문제 설명
해당 문제는 2022 카카오 신입 공채 1차 온라인 코딩테스트에서 출제된 문제다. 시간에 따라서 주차 요금을 계산하는 문제인데 링크를 타고 들어가서 문제 설명을 꼼꼼하게 읽어보는 걸 추천한다.
https://school.programmers.co.kr/learn/courses/30/lessons/92341?language=python3
문제 풀이
첫 번째 접근
해당 문제를 보자마자 프로그래머스의 과제 진행하기가 떠올랐다. 시간을 처리해주는 문제라 조금 까다로울 수 있기에 나는 시간을 모두 '분'으로 계산하여 단순화했다. 이렇게 하면 시간의 범위를 계산할 때 조금 더 빠르고 편리하게 할 수 있다.
일단 주어진 배열 값을 공백으로 나눈 다음에 시간은 ':'로 나눠줬다. 그리고 시와 분을 정수로 바꿔준 후 시간을 분으로 계산했다.
그리고 차가 들어온 경우 inOut을 True로 바꿔서 차가 들어왔음을 표시하고 timeIn에서 아까 구한 시간을 넣어서 들어온 시각을 표시했다. 뿐만 아니라 만일 처음 들어온 차일 경우에는 time[number]를 0으로 두어 누적 주차 시간을 구할 때 문제가 없게 했다.
차가 나간 경우에는 inOut에서 값을 False로 바꿔서 차가 나갓음을 표시하고 time[number]에는 나간 시간에다가 차가 들어온 시간(timeIn에 저장되어 있다)을 빼준 값을 더해서 주차 누적시간을 구했다.
위의 반복문을 모두 돌고 나서는 차가 들어왔지만 나가지 않은 경우를 계산해줘야 한다. 이 경우 23:59를 출차 시간으로 계산하기에 finialTime에 23:59를 계산한 시간을 넣어줬다. 그리고 inOut을 확인하면서 value가 True라 나가지 않은 차들은 timeIn[key]의 값에 finialTime을 빼준 값을 누적해서 더해줬다.
여기서 끝이 아닌데, 바로 자동차 번호로 정렬을 해줘야 한다. 그렇기에 나는 자동차 번호와 주차 누적 시간을 묶어서 배열을 하나 만든 다음 해당 배열을 정렬하고 answer에는 정렬한 배열의 두 번째 값인 주차 요금만 넣도록 했다.
코드
import math
def solution(fees, records):
answer = []
money = []
time = {}
inOut = {}
timeIn = {}
finialTime = 0
# 시간을 구해주는 함수
def calTime(h, m):
return h*60 + m
# 주어진 시간으로 주차 요금을 구해주는 함수
def calMoney(t):
if t <= fees[0]:
return fees[1]
return fees[1] + (math.ceil((t-fees[0])/fees[2])*fees[3])
for record in records:
inTime, number, order = record.split(" ")
h, m = inTime.split(":")
h = int(h)
m = int(m)
tmpTime = calTime(h, m)
if order == "IN": # 차가 들어왔다.
if not (number in time): # 처음 들어온 차면 누적 시간을 0으로 초기화
time[number] = 0
inOut[number] = True # 들어왔음을 표시
timeIn[number] = tmpTime # 들어온 시간을 표시
else: # 차가 나갔다.
inOut[number] = False # 차가 나갔음을 표시
time[number] += (tmpTime-timeIn[number]) # 차가 나갔기에 나간 시간과 들어온 시간을 이용해 주차 시간을 누적해서 계산
# 차가 들어왔는데 안 나가는 경우 23:59를 출차시간으로 계산
finialTime = calTime(23, 59)
for key in inOut.keys():
if inOut[key] == True:
time[key] += (finialTime - timeIn[key])
# 차량 번호가 작은 자동차를 기준으로 정렬해야 하기에 정렬을 위한 배열을 만들어 준다.
for key in time.keys():
money.append((key, calMoney(time[key])))
money.sort(key=lambda x : (x[0], x[1])) # 차량 번호를 기준으로 정렬
# 정렬된 배열 중 주차 요금만 가지고 와서 answer에 넣어준다.
for m in money:
answer.append(m[1])
return answer
'algorithm > 코딩 테스트' 카테고리의 다른 글
문자열 나누기 (0) | 2023.06.26 |
---|---|
대충 만든 자판 (0) | 2023.06.26 |
컨베이어 벨트 위의 로봇 (0) | 2023.06.22 |
감시, python (0) | 2023.06.21 |
둘만의 암호, python (0) | 2023.06.20 |