💬 Idea
- 처음의 Idea..
- String 형식을 Date로 바꾸어 Date간의 시간차를 구하여 주차 시간을 구한 다음, 같은 차량번호에 한해 누적합을 구하는 방식으로 구현하려 했었다
- 그러나 더 효율적인 방법을 생각해보다가,, 문자열을 잘 쪼개어 시(hour), 분(minute) 단위로 나누어 구조체에 저장해주면 좋겠다는 생각이 들었다.
- 다른 풀이를 조금 더 참고하여, IN/OUT에 대한 state를 구조체에 함께 저장해주는 방식으로 구현했더니
- 입차기록만 존재하는 경우도 쉽게 판별할 수 있어 훨씬 효율적인 코드를 짤 수 있었다.!!!!!!!
💬 풀이
import Foundation
structParkingInfo{varhour:Intvarminute:Intvarstate:String}func solution(_ fees:[Int], _ records:[String])->[Int]{varparkingRecord:[String:[ParkingInfo]]=[:]varfeeDict:[String:Int]=[:]forrecordin records {letsplitRecord= record.components(separatedBy:[":",""])ifparkingRecord[splitRecord[2]]==nil{parkingRecord[splitRecord[2]]=[]}parkingRecord[splitRecord[2]]?.append(ParkingInfo(hour:Int(splitRecord[0])!, minute:Int(splitRecord[1])!, state:splitRecord[3]))}forcarRecordin parkingRecord {varcarRecord= carRecord
// 입차된 기록만 있는 경우
if carRecord.value.last?.state =="IN"{
// 23:59에 출차된 것으로 간주
carRecord.value.append(ParkingInfo(hour:23, minute:59, state:"OUT"))}
// 차량의 총 주차 시간을 계산
varsum=0forjinstride(from:0, through: carRecord.value.count -1, by:2){
sum +=calParkingTime(carRecord.value[j], carRecord.value[j +1])}feeDict[carRecord.key]= sum
}
// [차량 번호: 주차 시간] Dict를 기반으로 차량별 총 주차 요금을 계산하여 리턴
returncalParkingFee(fees, feeDict)}
// MARK: - 주차시간을 분 단위로 계산하는 함수
func calParkingTime(_ inTime:ParkingInfo, _ outTime:ParkingInfo)->Int{returnabs((inTime.hour *60+ inTime.minute)-(outTime.hour *60+ outTime.minute))}
// MARK: - 주차요금 계산 함수
func calParkingFee(_ fees:[Int], _ feeDict:[String:Int])->[Int]{varfeeDict= feeDict
letbasicHour=fees[0]letbasicFee=fees[1]letoverHour=fees[2]letoverFee=fees[3]for(carNumber, parkingHour)in feeDict {
// 기본 요금 범위
if parkingHour < basicHour {feeDict[carNumber]= basicFee
}else{
// 초과 요금 범위
varexceedTime=0
// 초과한 시간이 단위 시간으로 나누어 떨어지지 않으면 1 올림
if(parkingHour - basicHour)% overHour !=0{
exceedTime =((parkingHour - basicHour)/ overHour)+1}else{
exceedTime =((parkingHour - basicHour)/ overHour)}feeDict[carNumber]= exceedTime * overFee + basicFee
}}
// 차량 번호가 작은 자동차부터 차례대로 담아 Array를 리턴
return feeDict.sorted{ $0.key < $1.key }.map{Int($0.value)}}소요시간 : 2시간 18분
💬 알게된 것
✅ intervalSinceTime
- Date() 간의 시간차를 계산해주는 함수
- 결과가 초 단위로 리턴되므로 분 단위로 사용할 때는 60으로 나눠 사용하면 된다 😊
💬 Idea💬 풀이소요시간: 2시간 18분💬 알게된 것✅ intervalSinceTime