본문 바로가기
알고리즘

[Swift] 프로그래머스 - 카카오 주차 요금 계산

by 고고 2022. 4. 20.

문제: https://programmers.co.kr/learn/courses/30/lessons/92341

 

코딩테스트 연습 - 주차 요금 계산

[180, 5000, 10, 600] ["05:34 5961 IN", "06:00 0000 IN", "06:34 0000 OUT", "07:59 5961 OUT", "07:59 0148 IN", "18:59 0000 IN", "19:09 0148 OUT", "22:59 5961 IN", "23:00 5961 OUT"] [14600, 34400, 5000]

programmers.co.kr

 

 

이 문제의 풀이는

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 }
}

댓글