주차장의 요금표와 차량이 들어오고(입차) 나간(출차) 기록이 주어졌을 때, 차량별로 주차 요금을 계산하려고 합니다. 아래는 하나의 예시를 나타냅니다.
| 기본 시간(분) | 기본 요금(원) | 단위 시간(분) | 단위 요금(원) |
|---|---|---|---|
| 180 | 5000 | 10 | 600 |
| 시각(시:분) | 차량 번호 | 내역 |
|---|---|---|
| 05:34 | 5961 | 입차 |
| 06:00 | 0000 | 입차 |
| 06:34 | 0000 | 출차 |
| 07:59 | 5961 | 출차 |
| 07:59 | 0148 | 입차 |
| 18:59 | 0000 | 입차 |
| 19:09 | 0148 | 출차 |
| 22:59 | 5961 | 입차 |
| 23:00 | 5961 | 출차 |
| 차량 번호 | 누적 주차 시간(분) | 주차 요금(원) |
|---|---|---|
| 0000 | 34 + 300 = 334 | 5000 + ⌈(334 - 180) / 10⌉ x 600 = 14600 |
| 0148 | 670 | 5000 +⌈(670 - 180) / 10⌉x 600 = 34400 |
| 5961 | 145 + 1 = 146 | 5000 |
주차 요금을 나타내는 정수 배열 fees, 자동차의 입/출차 내역을 나타내는 문자열 배열 records가 매개변수로 주어집니다. 차량 번호가 작은 자동차부터 청구할 주차 요금을 차례대로 정수 배열에 담아서 return 하도록 solution 함수를 완성해주세요.
fees의 길이 = 4
1 ≤ records의 길이 ≤ 1,000
| fees | records | result |
|---|---|---|
| [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] |
| [120, 0, 60, 591] | ["16:00 3961 IN","16:00 0202 IN","18:00 3961 OUT","18:00 0202 OUT","23:58 3961 IN"] | [0, 591] |
| [1, 461, 1, 10] | ["00:00 1234 IN"] | [14841] |
import Foundation
func solution(_ fees:[Int], _ records:[String]) -> [Int] {
var result: [Int] = []
var times: [String: Int] = [:]
var history: [String: String] = [:]
for record in records {
let info = record.split(separator: " ")
let time = String(info[0])
let number = String(info[1])
let status = String(info[2])
if status == "IN" {
if (times[number] == nil) {
times[number] = 0
}
history[number] = time
} else {
times[number]! += toMinutes(time) - toMinutes(history[number]!)
history[number] = ""
}
}
let max = 23 * 60 + 59
for info in history {
if info.value != "" {
times[info.key]! += (max - toMinutes(info.value))
history[info.key] = ""
}
}
let sort = times.sorted{$0.key < $1.key}
let list = sort.map{ $0.value }
for minutes in list {
result.append(getTotalFee(minutes, fees))
}
return result
}
func toMinutes(_ time: String) -> Int {
let sep = time.split(separator: ":")
let hour = Int(String(sep[0]))!
let min = Int(String(sep[1]))!
let result = hour * 60 + min
return result
}
func getTotalFee(_ minutes: Int, _ fees: [Int]) -> Int {
if minutes <= fees[0] {
return fees[1]
} else {
let remain = minutes - fees[0]
var unit = remain / fees[2]
if remain % fees[2] != 0 {
unit += 1
}
return (unit * fees[3]) + fees[1]
}
}