요구능력 : 문제 이해능력
코드설명 :
무슨 알고리즘을 썻다기 보다는 문제를 이해하고 어떤방식으로 풀어나갈 수 있는지를 보는 문제같다.
내가 생각하는 이 문제에서 핵심
1) 차량번호와 입출차시간을 어떻게 저장할 것인지
2) 시간계산을 분으로 바꿔서 할 줄 아는지
3) 문자열을 다룰줄 아는지
4) 출차시간이 없을때 처리를 어떻게 할 것인지
5) 나머지 올림을 어떻게 처리할 것인지
1)의 경우
차량번호별로 입출차시간을 배열로 받아서 입출차 시간을 저장한다.
var carNumTimeDict = [String: [Int]]()//차량번호, 입출차시간
2)과 3)의 경우
문자열을 분리해서 시간을 분으로 환산해서 1)의 딕셔너리에 저장해주었다.
for i in records{
let a = i.split(separator: " ").map{String($0)}
let time = a[0].split(separator: ":").map{Int(String($0))!}
carNumTimeDict[a[1]]!.append(time[0] * 60 + time[1])
}
4)의 경우
입/출차시간이 2으로 나누어 떨어지지 않으면 홀수개수만큼 있는 것이므로 그건 입차하고 출차는 안한게된다.
이것은 문제의 조건중 주차장에 이미 있는 차량이 다시 입차되는 경우는 없다고 했으므로 보장된다.
그러므로 23:59를 분으로 환산해서 딕셔너리에 추가해준다.
for i in carNumTimeDict{
if i.value.count % 2 != 0{
carNumTimeDict[i.key]?.append((23 * 60) + 59)
}
}
5)의 경우
cal = (구한 총 시간 - 기본 시간)에서 단위시간을 나누었을때 0 보다 크면 올림을 해주기 위해 temp를 true로 두고
cal 을 나눠준 후에 temp가 true이면 cal에 1을 더해서 올림을 해주었다.
for i in 0..<arr.count{
if arr[i] <= basicTime{
result[i] = basicFee
}else{
var temp = false
cal = (arr[i] - basicTime)
if cal % unitTime > 0 {
temp = true
}
cal = cal / unitTime
if temp{
cal += 1
}
result[i] = (basicFee + (cal * unitFee))
}
}
후기 : 구현문제는 귀찮아서 여태 안풀었었는데 카카오 풀어봐야겠다고 생각해서 한번풀어봤다.
빨리 백준에 있는 구현도 하나씩 풀어봐야겠다.
import Foundation
//fees[0] = 기본시간(분)
//fees[1] = 기본요금(원)
//fees[2] = 단위시간(분)
//fees[3] = 단위요금(원)
//records = 시각 차량번호 내역
func solution(_ fees:[Int], _ records:[String]) -> [Int] {
let basicTime = fees[0]
let basicFee = fees[1]
let unitTime = fees[2]
let unitFee = fees[3]
var carNumTimeDict = [String: [Int]]()//차량번호, 입출차시간
for i in records{
let a = i.split(separator: " ").map{String($0)}
carNumTimeDict[a[1]] = []
}
var result = Array(repeating: 0, count: carNumTimeDict.keys.count)//아래에서 += 해줘야되서 차의 개수만큼 배열생성
var arr = Array(repeating: 0, count: carNumTimeDict.keys.count) //요금 계산할 분 누적시키기
for i in records{
let a = i.split(separator: " ").map{String($0)}
let time = a[0].split(separator: ":").map{Int(String($0))!}
carNumTimeDict[a[1]]!.append(time[0] * 60 + time[1])
}
for i in carNumTimeDict{
if i.value.count % 2 != 0{
carNumTimeDict[i.key]?.append((23 * 60) + 59)
}
}
var idx = 0 //result에 들어가는 순서맞추기위한인덱스
for i in carNumTimeDict.sorted(by: {$0.key < $1.key}){
for j in stride(from: i.value.count - 1, through: 0, by: -1) {
if j % 2 != 0 && j - 1 >= 0{
let diff = i.value[j] - i.value[j - 1]
arr[idx] += diff
}
}
idx += 1
}
var cal = 0
for i in 0..<arr.count{
if arr[i] <= basicTime{
result[i] = basicFee
}else{
var temp = false
cal = (arr[i] - basicTime)
if cal % unitTime > 0 {
temp = true
}
cal = cal / unitTime
if temp{
cal += 1
}
result[i] = (basicFee + (cal * unitFee))
}
}
return result
}
'Algorithm > 문제풀이_프로그래머스' 카테고리의 다른 글
[Swift][프로그래머스][LV_2] 위장 (0) | 2022.02.22 |
---|---|
[Swift][프로그래머스][LV_2] 양궁대회 (0) | 2022.02.22 |
[Swift][프로그래머스][LV_1] 신고결과받기 (0) | 2022.02.19 |
[Swift][프로그래머스][LV_1] 예산 (0) | 2021.11.19 |
[Swift][문자열][LV_2][프로그래머스] 영어 끝말잇기 (0) | 2021.11.19 |
댓글