문제: https://programmers.co.kr/learn/courses/30/lessons/92341
이 문제의 풀이는
1. 총 주차 시간 구하기
2. 주차 시간에 따른 요금 계산하기
1. 총 주차시간 구하기
enterTime 딕셔너리를 통해 입차 시간을 기록합니다. 출차할 때에는 출차 시간 - 입차 시간으로 주차 시간을 구합니다. 이때 같은 차가 여러 번 입차할 수 있으므로 totalTime 딕셔너리를 통해 총 주차 시간을 구합니다.
records에 출차 시간이 없는 차가 있을 수 있습니다. records 순회 후 출차 시간이 없는 차는 아직 enterTime 딕셔너리에 남아있게 하기 위해 출차 시에 enterTime[차 번호] = nil 을 합니다. enterTime 딕셔너리를 순회하여 출차되지 않은 차를 "23:59"에 출차 처리하여 주차 시간을 더해줍니다.
2. 주차 시간에 따른 요금 계산하기
totalTime 딕셔너리를 순회하며 시간에 따른 요금을 계산합니다.
차 번호가 작은 순서로 요금 배열을 반환합니다.
import Foundation
func solution(_ fees:[Int], _ records:[String]) -> [Int] {
var enterTime = [String: Int]()
var totalTime = [String: Int]()
var moneyDict = [String: Int]()
func convertToMinutes(_ str: String) -> Int {
let array = str.split(separator: ":").map { Int(String($0))! }
return array[0] * 60 + array[1]
}
func exit(carNumber: String, exitTime: String) { // 출차 처리 함수
let time = convertToMinutes(exitTime) - enterTime[carNumber]! // 주차 시간
if totalTime[carNumber] == nil { // 총 시간에 더하기
totalTime[carNumber] = time
} else {
totalTime[carNumber]! += time
}
}
// 1. 총 주차시간 구하기
for record in records {
let array = record.split(separator: " ").map { String($0) }
let time = array[0]
let carNumber = array[1]
let type = array[2]
if type == "IN" {
enterTime[carNumber] = convertToMinutes(time)
} else {
exit(carNumber: carNumber, exitTime: time)
enterTime[carNumber] = nil
}
}
for dict in enterTime { // 출차하지 않은 차가 있다면
exit(carNumber: dict.key, exitTime: "23:59")
}
// 2. 총 주차시간에 따른 요금 계산하기
for dict in totalTime {
let carNumber = dict.key
let duration = dict.value
var money = fees[1] // 기본 요금
if duration > fees[0] { // 기본 시간 이상 시
let over = duration - fees[0]
money += Int(ceil(Double(over) / Double(fees[2]))) * fees[3] // 초과 시간 * 초과 요금
}
moneyDict[carNumber] = money
}
return moneyDict.sorted(by: { $0.key < $1.key }).map { $0.value }
}
'알고리즘' 카테고리의 다른 글
[Swift] 백준 1992번 쿼드트리 (0) | 2022.05.11 |
---|---|
[Swift] 백준 2630번 색종이 만들기 (0) | 2022.05.11 |
[Swift] 프로그래머스 - 카카오 k진수에서 소수 개수 구하기 (0) | 2022.04.20 |
[Swift] 백준 2231번 분해합 (0) | 2022.04.13 |
2022 SK ICT 2차 코딩테스트 후기 (0) | 2022.03.23 |
댓글