Algorithm
[프로그래머스] 주차 요금 계산
쑤야.
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
}