반응형
요즘 스위프트 자체에 조금 더 익숙해질 필요가 있다고 느껴 "꼼꼼한 재은 씨의 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를 사용했다면 코드가 조금은 깔끔해지지 않았을까 하는 생각이 듭니다.
반응형
'개발 > PS' 카테고리의 다른 글
[Swift] 프로그래머스 Lv2 문자열 압축 (0) | 2022.06.20 |
---|---|
[Swift] 프로그래머스 1단계 모음 (0) | 2022.06.06 |
[Swift] 프로그래머스 Lv1 다트게임 (0) | 2022.03.29 |
[Swift] 프로그래머스 Lv2 순위검색 (0) | 2022.03.28 |
[Swift] 프로그래머스 LV1 비밀지도 (0) | 2022.03.12 |