๐ Problem Solution/Programmers
[Swift] 2022 KAKAO BLIND RECRUITMENT ์ฃผ์ฐจ ์๊ธ ๊ณ์ฐ
Fomagran ๐ป
2022. 1. 19. 15:50
728x90
๋ฐ์ํ

Problem
์ฝ๋ฉํ ์คํธ ์ฐ์ต - ์ฃผ์ฐจ ์๊ธ ๊ณ์ฐ
[180, 5000, 10, 600] ["05:34 5961 IN", "06:00 0000 IN", "06:34 0000 OUT", "07:59 5961 OUT", "07:59 0148 IN", "18:59 0000 IN", "19:09 0148 OUT", "22:59 5961 IN", "23:00 5961 OUT"] [14600, 34400, 5000]
programmers.co.kr
Solution
1. records์ ๊ธฐ๋ก๋๋ก ์๊ฐ์ ๊ณ์ฐํด ์ ์ฅํ๋ค.
var timeInfo:[String:Int] = [:]
var parkInfo:[String:Int] = [:]
func calTimeByRecord(_ records:[String],_ parkInfo:inout [String:Int],_ timeInfo:inout [String:Int]) {
for record in records {
let split = record.split(separator: " ")
let time = String(split[0])
let number = String(split[1])
let isIN = split[2] == "IN"
if isIN {
parkInfo[number] = changeTimeToMinutes(time)
}else {
let out = changeTimeToMinutes(time)
let minutes = out - parkInfo[number]!
if timeInfo[number] == nil {
timeInfo[number] = minutes
}else {
timeInfo[number]! += minutes
}
parkInfo[number] = nil
}
}
}
* ๋ฌธ์๋ก ๋ ์๊ฐ์ ๋ถ์ผ๋ก ๋ฐ๊พธ๋ ํจ์
func changeTimeToMinutes(_ time:String) -> Int {
let split = time.split(separator: ":")
let hours = Int(split[0])!
let minutes = Int(split[1])!
return hours*60 + minutes
}
2. ๋ง์ฝ ์ฃผ์ฐจ ์ ๋ณด์ ๋ค์ด์จ ์ ๋ณด๋ง ์๋ค๋ฉด ์ต๋ ์๊ฐ(23:59)์์ ๋ค์ด์จ ์๊ฐ์ ๊ตฌํด์ค๋ค.
let maxTime = 23*60+59
for (number,time) in parkInfo {
if timeInfo[number] == nil {
timeInfo[number] = maxTime - time
}else {
timeInfo[number]! += maxTime - time
}
}
3. ์๊ฐ๋๋ก ์๊ธ์ ๊ตฌํ๋ค.
for (number,time) in timeInfo {
feeInfo[number] = getTotalFee(time,fees)
}
* ์๊ธ์ ๊ตฌํ๋ ํจ์
func getTotalFee(_ minutes:Int,_ fees:[Int]) -> Int {
let freetime = fees[0]
let defaultFee = fees[1]
let perTime = fees[2]
let fee = fees[3]
if minutes <= freetime { return defaultFee }
let c = Int(ceil(Double((minutes - freetime))/Double(perTime)))
let total = defaultFee + c * fee
return total
}
4. ๋ฒํธํ์ด ์ ์ ์์ผ๋ก ์ ๋ ฌํด์ ๋ฐํํ๋ค.
return feeInfo.sorted{$0.key < $1.key}.map{$0.value}
Source Code
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import Foundation | |
func solution(_ fees:[Int], _ records:[String]) -> [Int] { | |
var parkInfo:[String:Int] = [:] | |
var timeInfo:[String:Int] = [:] | |
var feeInfo:[String:Int] = [:] | |
let maxTime = 23*60+59 | |
calTimeByRecord(records,&parkInfo, &timeInfo) | |
for (number,time) in parkInfo { | |
if timeInfo[number] == nil { | |
timeInfo[number] = maxTime - time | |
}else { | |
timeInfo[number]! += maxTime - time | |
} | |
} | |
for (number,time) in timeInfo { | |
feeInfo[number] = getTotalFee(time,fees) | |
} | |
return feeInfo.sorted{$0.key < $1.key}.map{$0.value} | |
} | |
func calTimeByRecord(_ records:[String],_ parkInfo:inout [String:Int],_ timeInfo:inout [String:Int]) { | |
for record in records { | |
let split = record.split(separator: " ") | |
let time = String(split[0]) | |
let number = String(split[1]) | |
let isIN = split[2] == "IN" | |
if isIN { | |
parkInfo[number] = changeTimeToMinutes(time) | |
}else { | |
let out = changeTimeToMinutes(time) | |
let minutes = out - parkInfo[number]! | |
if timeInfo[number] == nil { | |
timeInfo[number] = minutes | |
}else { | |
timeInfo[number]! += minutes | |
} | |
parkInfo[number] = nil | |
} | |
} | |
} | |
func getTotalFee(_ minutes:Int,_ fees:[Int]) -> Int { | |
let freetime = fees[0] | |
let defaultFee = fees[1] | |
let perTime = fees[2] | |
let fee = fees[3] | |
if minutes <= freetime { return defaultFee } | |
let c = Int(ceil(Double((minutes - freetime))/Double(perTime))) | |
let total = defaultFee + c * fee | |
return total | |
} | |
func changeTimeToMinutes(_ time:String) -> Int { | |
let split = time.split(separator: ":") | |
let hours = Int(split[0])! | |
let minutes = Int(split[1])! | |
return hours*60 + minutes | |
} |
728x90
๋ฐ์ํ