상세 컨텐츠

본문 제목

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

Algorithm

by 쑤야. 2023. 12. 29. 15:52

본문

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

접근


  • 하나의 차량이 여러 번 입차/출차 할 수 있으므로(입차 다음은 무조건 출차로 순서 고정), 일단 차량에 대한 정보를 배열에 모아준 이후, 인덱스 값을 활용하여 이용시간을 연산한다. 

 

로직


  • 차량번호 별로 입차/출차 기록 모으기
  • 차량 번호 순으로 결과를 반환해야 하므로, 차량 번호로 정렬한 후에 각 차량 번호들에 대해 반복문을 돌며 연산 수행
  • 만약 입차/출차 기록이 홀수인 경우, 23:59에 출차 기록 추가
  • 짝수 인덱스가 무조건 입차, 홀수 인덱스가 무조건 출차이므로 0부터 2씩 증가하는 반복문을 통해 i+1의 값과 i의 값의 차이를 주차 시간 누적에 더한다.

 

코드


1. Python 풀이

import math

def solution(fees, records):
    
    car = {} #차량번호:[주차시간]
    
    def time(t):
        data = list(map(int, t.split(":")))
        return data[0]*60 + data[1]
    
    def calculate(t):
        if t <= fees[0]:
            return fees[1]
        return fees[1] + math.ceil((t-fees[0])/fees[2]) * fees[3]
    
    for record in records:
        
        data = record.split(" ")
        
        if data[1] not in car:
            car[data[1]] = []
            
        car[data[1]].append(time(data[0]))
        
    answer = []
    for c in sorted(car):
        
        if len(car[c]) % 2 != 0:
            car[c].append(time("23:59"))
            
        total = 0
        for i in range(0, len(car[c]), +2):
            total += car[c][i+1] - car[c][i]
            
        answer.append(calculate(total))
        
    return answer

2. Swift 풀이

import Foundation

func solution(_ fees:[Int], _ records:[String]) -> [Int] {
    
    func time(_ t: String) -> Int {
        let data = t.split(separator: ":").map{ Int($0)! }
        return data[0]*60 + data[1]
    }
    
    func calculate(_ t: Int) -> Int {
        if t <= fees[0]{
            return fees[1]
        }
        return fees[1] + Int(ceil(Float(t-fees[0])/Float(fees[2]))) * fees[3]
    }
    
    var car = [String:[Int]]()
    
    for record in records{
        
        let data = record.split(separator: " ").map{ String($0) }
        
        if car[data[1]] == nil {
            car[data[1]] = []
        }
        car[data[1]]!.append(time(data[0]))
    }
        
    var answer = [Int]()
    for (c,_) in car.sorted(by: { $0.key < $1.key }) {
        if car[c]!.count % 2 != 0 {
            car[c]!.append(time("23:59"))
        }
            
        var total = 0
        for i in stride(from: 0, to: car[c]!.count, by: +2){
            total += car[c]![i+1] - car[c]![i]
        }
            
        answer.append(calculate(total))
    }
        
    return answer
}

관련글 더보기