티스토리 뷰
문제 설명
주차장의 요금표와 차량이 들어오고(입차) 나간(출차) 기록이 주어졌을 때, 차량별로 주차 요금을 계산하려고 합니다. 아래는 하나의 예시를 나타냅니다.
- 요금표
기본 시간(분) 기본 요금(원) 단위 시간(분) 단위 요금(원)
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 |
- 어떤 차량이 입차된 후에 출차된 내역이 없다면, 23:59에 출차된 것으로 간주합니다.
- 0000번 차량은 18:59에 입차된 이후, 출차된 내역이 없습니다. 따라서, 23:59에 출차된 것으로 간주합니다.
- 00:00부터 23:59까지의 입/출차 내역을 바탕으로 차량별 누적 주차 시간을 계산하여 요금을 일괄로 정산합니다.
- 누적 주차 시간이 기본 시간이하라면, 기본 요금을 청구합니다.
- 누적 주차 시간이 기본 시간을 초과하면, 기본 요금에 더해서, 초과한 시간에 대해서 단위 시간 마다 단위 요금을 청구합니다.
- 초과한 시간이 단위 시간으로 나누어 떨어지지 않으면, 올림합니다.
- ⌈a⌉ : a보다 작지 않은 최소의 정수를 의미합니다. 즉, 올림을 의미합니다.
주차 요금을 나타내는 정수 배열 fees, 자동차의 입/출차 내역을 나타내는 문자열 배열 records가 매개변수로 주어집니다. 차량 번호가 작은 자동차부터 청구할 주차 요금을 차례대로 정수 배열에 담아서 return 하도록 solution 함수를 완성해주세요.
풀이
어렵지 않게 풀 수 있는 문제였다. 내 생각에 가장 중요한 것은 누적 주차 시간을 구하는 것이 가장 중요할 것 같았다.
나는 누적 주차 시간을 구하기 위해 딕셔너리와 IN / OUT을 이용하였다. 들어오는 데이터가 IN일 경우엔 key가 차량번호인 dictionary의 value에 시간을 빼주었고, OUT일 경우엔 더해주었다. 이때, 시간은 모두 분으로 환산하였다.
즉, 05:30분에 들어온 0000차는 {0000: -330} 이 되고 만약 13:30에 나갔다면 -330 + 810인 480이 시간이 되는 것이다.
이때, 23:59까지 있어 IN만 존재한 데이터는 value값이 음수일 것이다. 따라서 value가 음수인 것에는 1439를 더해주어 총 시간을 구할 수 있었다.
올림을 위해서는 ceil메서드를 사용하였다.
import Foundation
// 기본시간, 기본요금, 단위 시간, 단위 요금
func solution(_ fees:[Int], _ records:[String]) -> [Int] {
var data: [String: Int] = [:]
var result: [Int] = []
for i in records {
let time = String(i.split(separator: " ")[0])
let number = String(i.split(separator: " ")[1])
let inOut = String(i.split(separator: " ")[2])
//분으로 환산한 시간
let newTime: Int = Int(time.split(separator: ":")[0])! * 60 + Int(time.split(separator: ":")[1])!
//In인 경우 -로, Out인 경우 +해주면 총 시간 나옴
if inOut == "IN" {
//이미 데이터가 있는 경우와 없는 경우를 나눠서 생각
if data[number] == nil {
data.updateValue(-newTime, forKey: number)
} else {
data.updateValue(data[number]! - newTime, forKey: number)
}
} else {
// Out인 경우는 이미 해당 키에 대한 데이터가 존재함
data.updateValue(data[number]! + newTime, forKey: number)
}
}
// 요금 계산을 하는데 시간이 - 인 값들은 23:59분에 출차처리를 한 뒤 계산
for i in data.keys {
// - 인 경우
if data[i]! <= 0 {
let time: Int = data[i]! + 1439 // 23:59에 출차처리
if time <= fees[0] { // 기본 시간 초과했는지 확인
data.updateValue(fees[1], forKey: i)
} else {
data.updateValue(fees[1] + Int(ceil(Double(time - fees[0]) / Double(fees[2]))) * fees[3], forKey: i)
}
} else {
let time: Int = data[i]!
if time <= fees[0] { // 기본 시간 초과했는지 확인
data.updateValue(fees[1], forKey: i)
} else {
data.updateValue(fees[1] + Int(ceil(Double(data[i]! - fees[0]) / Double(fees[2]))) * fees[3], forKey: i)
}
}
}
for i in data.keys.sorted(by: <) {
result.append(data[i]!)
}
return result
}
결론
어렵지 않게 풀 수 있었던 것 같다. 시간복잡도도 O(n)으로 나쁘지 않다고 생각했다. 푼 사람들이 더 나오면 다른 분들의 코드도 다시 확인해봐야 할 것 같다.
'PS' 카테고리의 다른 글
[Swift]프로그래머스_방금그곡 (0) | 2022.06.08 |
---|---|
[Swift]프로그래머스_n진수 게임 (0) | 2022.06.07 |
[Swift]프로그래머스_k진수에서 소수 개수 구하기 (0) | 2022.05.16 |
[Swift]프로그래머스_캐시 (0) | 2022.05.16 |
[Swift] 프로그래머스_프렌즈4블록 (0) | 2022.05.15 |
- Total
- Today
- Yesterday