💪 주차 요금 계산이 이렇게 어려웠나..?
⇢ Dictionary
⇢ String
본 문제는 어려운 알고리즘이 요구되기 보다는, 정말 주어진 조건을 얼마나 잘 구현할 수 있는지 묻는 문제라고 생각한다.
⇢ "IN, OUT" 자동차의 주차 상태를 어떻게 기록할 것인가?
⇢ 자동차의 주차시간을 어떻게 정수로 계산할 것인가?
⇢ "IN"상태에서 기록이 없는 자동차의 주차요금 계산은 어떻게 할 것인가?
우선 다음과 같이 접근해 볼 수 있다.
(1) answer, 각각의 차량의 주차요금을 저장할 [Int] 배열
(2) inToOut, 최종 주차상태가 IN인 자동차의 시간 계산을 위한 변수
(3) carInfo, 자동차 번호를 키값으로, 주차 시간과 주차 상태를 기록하는 Dictionary
다음으로, 주어진 각각의 자동차 주차 정보를 토대로 필요한 값들을 추출한다.
(1) time -> 주차시간을 계산 [시간 : 분] -> " 시간*60 + 분 "
(2) carNumber -> 자동차 번호
(3) carState -> 현재 자동차의 주차 상태, "In Out"
(4) carInfo에서 현재 자동차 번호를 대입하며, 주차시간 및 주차상태를 수정.
마지막으로, 차량 번호 순으로 정렬하여 각각의 차량의 주차요금을 계산한다
(1) Dictionary의 경우, sort()함수가 따로 없다는 점을 주의!!
(1-1) 구체적인 이유는 잘 모르겠으나, sorted()함수를 통해, 정렬
(2) 정렬된 차량 정보에서, 각각의 차량 별 주차 상태를 확인.
(2-1) "OUT"인 경우 그냥 계산.
(2-2) "IN"인 경우, inToOut을 통해 시간 계산.
(3) 주차 시간을 토대로, 주차 요금을 계산하여 answer 배열에 저장
import Foundation
func solution(_ fees:[Int], _ records:[String]) -> [Int] {
var answer: [Int] = []
var inToOut = 23*60 + 59
var carInfo: [String:(time: Int, state: String)] = [:]
records.forEach{
let recordArr = $0.components(separatedBy: " ")
var time = { () -> Int in
var timeInfo = recordArr[0].components(separatedBy: ":")
var hour = Int(timeInfo[0])!
var min = Int(timeInfo[1])!
return hour * 60 + min
}()
var carNumber = recordArr[1]
var carState = recordArr[2]
if carInfo[carNumber] == nil{ carInfo[carNumber] = (time: time, state: carState) }
else{ carInfo[carNumber]! = (time: time - carInfo[carNumber]!.time , state: carState) }
}
var sortedCarInfo = carInfo.sorted{ $0.key < $1.key }
sortedCarInfo.forEach{
var car = $0
if car.value.state == "IN"{ car.value.time = inToOut - car.value.time}
var parkingTime: Float = Float(car.value.time) - Float(fees[0])
if parkingTime <= 0 { answer.append(fees[1]) }
else{
var moneyPerT:Int = Int(ceil(parkingTime/Float(fees[2])))
answer.append(fees[1] + moneyPerT * fees[3])
}
}
return answer
}