[프로그래머스 LV2] 주차 요금 계산

Junyoung Park·2022년 8월 20일
0

코딩테스트

목록 보기
576/631
post-thumbnail

1. 문제 설명

주차 요금 계산

2. 문제 분석

입차 및 출차를 체크하면서 특정 차 번호의 시간을 기록한다. 주차장을 사용한 시간이 각 차량 번호 별로 정해진 후, 전체적으로 요금을 계산한다.

  1. 시간 문자열(시:분)을 정수 값으로 변환하는 함수
  2. 특정 차 번호마다 총 주차 시간을 기록하는 딕셔너리
  3. 입차는 들어온 시간을 기록에서 빼고, 출차는 들어온 시간을 기록에서 더한다. 결과적으로 (출차 시간 - 입차 시간)이 되기 때문이다.
  4. 마지막까지 입차인 상태의 차는 자동으로 23시 59분 출차로 처리한다.
  5. 요금 계산 함수에서 올림까지 확인해서 계산한다.

3. 나의 풀이

import Foundation

func solution(_ fees:[Int], _ records:[String]) -> [Int] {
    var carsDict = [String:Int]()
    var carsCheck = [String:Bool]()
    
    let (defaultTime, defaultPrice, unitTime, unitPrice) = (fees[0], fees[1], fees[2], fees[3])
    
    func getPrice(_ time: Int) -> Int {
        if time <= defaultTime {
            return defaultPrice
        } else {
            var total = defaultPrice
            let q: Int
            if (time - defaultTime) % unitTime == 0 {
                q = (time - defaultTime) / unitTime
            } else {
                q = (time - defaultTime) / unitTime + 1
            }
            return defaultPrice + q * unitPrice
        }
    }
    
    for record in records {
        let record = record.split(separator: " ").map{String($0)}
        let (timeString, car, carCheck) = (record[0], record[1], record[2])
        let time = convertTime(timeString)
        let carTime = carsDict[car] ?? 0
        if carCheck == "IN" {
            carsDict[car] = carTime - time
            carsCheck[car] = false
        } else {
            carsDict[car] = carTime + time
            carsCheck[car] = true
        }
    }
    
    let lastTime = convertTime("23:59")
    for car in carsCheck.keys {
        guard let value = carsCheck[car] else { continue }
        if !value {
            let carTime = carsDict[car] ?? 0
            carsDict[car] = carTime + lastTime
            carsCheck[car] = true
        }
    }
    
    var prices = [Int]()
    let sortedCarNames = carsDict.keys.sorted(by: <)
    for car in sortedCarNames {
        let time = carsDict[car] ?? 0
        let price = getPrice(time)
        prices.append(price)
    }
    
    return prices
}

func convertTime(_ time: String) -> Int {
    let time = time.split(separator: ":").map{Int(String($0))!}
    let (hour, minute) = (time[0], time[1])
    return hour * 60 + minute
}
profile
JUST DO IT

0개의 댓글