[swift] 주차 요금 계산

hooon·2022년 8월 3일
0

[Swift 알고리즘]

목록 보기
5/8

📌 프로그래머스 Lv - 2

💪 주차 요금 계산이 이렇게 어려웠나..?

📝 KeyWord

⇢ 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
}

0개의 댓글