https://school.programmers.co.kr/learn/courses/30/lessons/92341
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제
주차 요금표가 주어지고 입출차 기록 (in,out)이 주어졌을때 주차요금을 계산하는 문제이다.
입력
fees, records 리스트가있다.fees 의 길이 4
- 1 ≤ fees[0] ≤ 1,439
- 0 ≤ fees[1] ≤ 100,000
- 1 ≤ fees[2] ≤ 1,439
- 1 ≤ fees[3] ≤ 10,000
records 의 길이 <= 1000, 문자열 형식으로 시각과 차번호 in out 중하나가 적혀있다.
출력
차 번호표의 수가 작은 순서대로 내야할 금액의 리스트를 반환한다.
풀이
먼저 in 일때와 out 일때를 나눠서 각각 할일을 적었다. in 일때는 시작 시간이다. 시간길이 = 마지막시간 - 시작시간 이므로 records 에 적힌 시간이 시작시간이므로 누적된 시간 에 recoreds 시간을 빼줬다. 그리고 누적 시간은 시간 길이들을 더해줘야하므로 사실상 더해주기만 하면된다.
따라서 in 일때는 누적시간 - 시작시간
out 일때 는 마지막 즉 나가는 시간이다. 이때는 누적 시간에 recoreds 시간을 더해주기만 하면된다. 그러면 마지막 시간 - 시작 시간이 된다.
out 일때 누적시간 + 마지막시간
나열해보면 (마지막 시간 - 시작시간) = 누적시간 + (마지막시간 - 시작시간)
그리고 차량 번호에 맞게 오름차순으로 정렬해준다.
마지막까지 출차 즉 out 을 안한 차는 마지막 시간을 더해줬다. 여기사 말하는 마지막시간은 23:59 이다.
import math # 올림을 위해 임포트
def cusTime(time): # 시간을 숫자로 풀어서 표현
time = time.split(":")
return int(time[0]) * 60 + int(time[1])
def parkingFeeCalc(fees,durTime): # 주차비 계산 공식
return fees[1] + math.ceil((durTime - fees[0]) / fees[2]) * fees[3]
def solution(fees, records):
answer = []
carDict = {}
for record in records: # records 배열에 저장된 것들을 돌린다.
splitRecord = record.split() # 공백으로 나눠서 리스트로 저장
if splitRecord[-1] == 'IN': # in 일때
if splitRecord[1] in carDict:
sumCarTime = carDict[splitRecord[1]][0] - cusTime(splitRecord[0]) # 누적시간 - 시작시간
carDict[splitRecord[1]] = [sumCarTime,"IN"] # 딕셔너리 저장
else: 만약 딕셔너리에 해당 차량 번호가 없다면
carDict[splitRecord[1]] = [-cusTime(splitRecord[0]),"IN"] # 누적시간이 없으므로 누적시간을 0으로 설정하여 그냥 빼준다.
elif splitRecord[-1] == 'OUT': # out 일때
durTime = cusTime(splitRecord[0]) + carDict[splitRecord[1]][0] # 누적시간 + 마지막 시간
carDict[splitRecord[1]] = [durTime,"OUT"] # 저장
carDict = sorted(carDict.items(), key = lambda item: item[0]) # 차량 번호로 정렬
for carName,carData in carDict: # 차량 번호로 정렬된 순으로 반복
if carData[1] == "IN": # 아직 out이 안된 차량이 있다면
sumOfParkingTime = carData[0] + cusTime("23:59") # 누적시간 + 마지막 시간 (23:59)
if sumOfParkingTime <= fees[0]: # 만약 기본시간 보다 더빨리 나갔다면
res = fees[1] # 기본요금으로 낸다.
else:
res = parkingFeeCalc(fees,sumOfParkingTime) # 아니라면 계산된 요금
answer.append(res)
else:
sumOfParkingTime = carData[0]
if sumOfParkingTime <= fees[0]: # 만약 기본시간 보다 더빨리 나갔다면
res = fees[1] # 기본요금으로 낸다.
else:
res = parkingFeeCalc(fees,sumOfParkingTime) # 아니라면 계산된 요금
answer.append(res)
return answer
'알고리즘' 카테고리의 다른 글
백준/가장 가까운 세 사람의 심리적 거리/py (0) | 2022.08.22 |
---|---|
프로그래머스/문자열 압축/py (0) | 2022.08.21 |
프로그래머스/올바른 괄호/py (0) | 2022.08.17 |
프로그래머스/신규 아이디 추천/py (0) | 2022.08.17 |
프로그래머스/실패율/py (0) | 2022.08.15 |