개발/PS

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

유훈 | Yuhun 2022. 4. 2. 20:37
반응형

요즘 스위프트 자체에 조금 더 익숙해질 필요가 있다고 느껴 "꼼꼼한 재은 씨의 Swift"를 읽고 있는데 좋은 책인 것 같습니다.

개정판이 나온다면 바로 살 생각... 아무튼 같은 맥락으로 알고리즘을 스위프트로 조금씩 풀어보려 노력중입니다.. 

 

서론은 이쯤 하고.. 제가 작성한 코드는 다음과 같습니다.

import Foundation

var parkingTime: [String: Int] = [:]
var indic: [String:Int] = [:]

func solution(_ fees:[Int], _ records:[String]) -> [Int] {
    let outTime = 23*60 + 59
    
    for record in records {
        let split:[Substring] = record.split(separator: " ")
        if split[2] == "IN" {
            inCar(split: split) // 입차
        }
        else if split[2] == "OUT" {
            outCar(split: split) // 출차시 요금 추가
        }
    }
    
    // 마지막까지 출차되지 않은 차에 대한 시간 추가
    indic.forEach({key, value in
        let charge = outTime-value
        addTime(key: key, value: charge)
    })
    
    // chargeDic에 담긴 시간으로 차 번호별 요금 계산
    let result:[Int] = parkingTime.sorted(by: {$0.0 < $1.0}).map { // 차 번호 기준으로 정렬후 계산
        if $0.1 < fees[0] { // $0은 (key,value)튜플
            return fees[1]
        }
        let charge: Int = fees[1] + Int(ceil(Double($0.1-fees[0])/Double(fees[2])))*fees[3]
        
        return charge
    }
    
    return result
}

// 입차 시간 저장
func inCar(split:[Substring]) {
    let timeSplit:[Substring] = String(split[0]).split(separator: ":")
    let time:Int = Int(timeSplit[0])!*60 + Int(timeSplit[1])!
    indic[String(split[1])] = time
}

// 출차하면 주차 시간을 계산
func outCar(split:[Substring]) {
    let timeSplit:[Substring] = String(split[0]).split(separator: ":")
    let time:Int = Int(timeSplit[0])!*60 + Int(timeSplit[1])!
    let charge = time - indic[String(split[1])]!

    addTime(key: String(split[1]), value: charge)
    
    indic.removeValue(forKey: String(split[1]))
}

// 딕셔너리에 차 번호별 시간을 저장합니다.
func addTime(key:String, value:Int) {
    if (parkingTime[key] != nil) {
        parkingTime[key]! += value
    } else {
        parkingTime[key] = value
    }
}

 

과정은 입차 시간을 저장하고 있다가 출차시에 시간을 계산해 parkingTime에 저장해둡니다.

모든 입차, 출차가 끝나면 입차만 하고 출차하지 않은 차에 대해 23:59 기준으로 출차한 시간을 parkingTime의 해당 차 번호에 더해줍니다. 이후 parkingTime에 대해 차 번호 기준으로 오름차순 정렬하고 요금을 계산해 반환합니다.

 

사실 입력을 받을때 split이 아닌 components를 사용할까 했는데 subString을 사용해보고자 split을 사용했습니다.

근데 Components를 사용했다면 코드가 조금은 깔끔해지지 않았을까 하는 생각이 듭니다.

반응형