알고리즘 문제 풀이

[Swift] 프로그래머스 LV2. 주차 요금 계산

lgvv 2022. 4. 16. 02:10

프로그래머스 LV2. 주차 요금 계산

 

프로그래머스 LV2. 주차 요금 계산

 

2022 KAKAO BLIND RECRUTMENT 문제다!

 

카카오 문제를 풀때는 그냥 이름만으로도 늘 짜릿해.

 

✅ 코드

레벨은 2지만 풀었을 때 점수는 1점만 주더라.

그만큼 쉬웠다는 말이겠지 ㅜㅠ 근데 진짜 쉽긴 했다...

    import Foundation

    func solution(_ fees:[Int], _ records:[String]) -> [Int] {
        
        
        var dict: [String: String] = [:] // 차량번호 : 시간
        var totalTimeArray: [String: Int] = [:] // 차량번호 : 누적시간
        var priceDict: [String: Int] = [:] // 차량번호 : 금액
        
        // records 내에서의 인덱스와 차랑번호를 저장
        records.forEach { record in
            let info = record.components(separatedBy: " ")
            let carNumber = info[1]
            
            if dict[carNumber] == nil { // 아직 IN하지 않았다면
                dict[carNumber] = info[0]
                 if totalTimeArray[carNumber] == nil {
                    totalTimeArray[carNumber] = 0
                }
            } else { // 이미 차가 들어왔다면
                // 계산하는 로직 수행해야 합니다.
                let inTime = dict[carNumber]! // 이전에 들어왔던 시간
                let time = calueteTime(fees: fees, inTime: inTime, outTime: info[0]) // 이번 구간에서 주차한 시간 계산
                
                dict[carNumber] = nil // 출차 처리
                
                if totalTimeArray[carNumber] == nil {
                    totalTimeArray[carNumber] = time
                } else {
                    totalTimeArray[carNumber]! += time
                }
            }
        }
        
        dict.forEach { carNumber, value in
            let inTime = dict[carNumber]!
            let time = calueteTime(fees: fees, inTime: inTime, outTime: "23:59")
            
            totalTimeArray[carNumber]! += time
            dict[carNumber] = nil // 굳이 이 코드는 없어도 된다.
        }
        
        totalTimeArray.forEach { carNumber, time in
            let time = time - fees[0] // 기본시간 빼주기
            var price = fees[1] // 기본금액
            
            if time <= 0 {
                // 기본 금액만 내면 된다.
            } else {
                var count = time / fees[2]
                if time % fees[2] != 0 {
                    count += 1
                }
                
                price += count * fees[3]
            }
            
            priceDict[carNumber] = price
        }
        var answer = priceDict.sorted { $0.key < $1.key }.map { $0.value }
        
        return answer
    }

   func calueteTime(fees: [Int], inTime: String, outTime: String) -> Int{
        let inTimeArray = inTime.components(separatedBy: ":").map { Int($0)! }
        let outTimeArray = outTime.components(separatedBy: ":").map { Int($0)! }
        
        let hour = outTimeArray[0] - inTimeArray[0]
        let minute = outTimeArray[1] - inTimeArray[1]
        
        return hour * 60 + minute
    }