티스토리 뷰

문제 설명

 

주차장의 요금표와 차량이 들어오고(입차) 나간(출차) 기록이 주어졌을 때, 차량별로 주차 요금을 계산하려고 합니다. 아래는 하나의 예시를 나타냅니다.

  • 요금표

기본 시간(분)          기본 요금(원)    단위 시간(분)   단위 요금(원)

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)으로 나쁘지 않다고 생각했다. 푼 사람들이 더 나오면 다른 분들의 코드도 다시 확인해봐야 할 것 같다.

댓글
최근에 올라온 글
Total
Today
Yesterday