반응형
안녕하세요. 개발 중인 정주입니다.
오늘은 "프로그래머스(Lv.2) - 주차 요금 계산" 문제를 풀었습니다.
Github
문제 링크
풀이
이번 문제는 해시테이블을 이용한 구현 문제입니다.
1. 해시 테이블 구성하기
해시테이블은 차번호 : [입/출차 기록]으로 구성했습니다.
입출차 시간은 분으로 변환하여 Int로 저장합니다.
2. 주차 시간 계산하기
각 차 번호마다 구한 입출차 기록을 이용해 주차 시간을 계산합니다.
만약 입출차 기록의 개수가 홀수라면 마지막 출차 기록이 없는 것이므로 23:59를 추가해 줍니다.
var minSum = 0, minNums = cars[key]!
for i in 0..<minNums.count {
if i % 2 != 0 {
minSum += (minNums[i] - minNums[i-1] )
}
}
입출차 기록으로 차의 주차 시간을 계산합니다.
3. 비용 구하기
주차 시간을 이용해 비용을 구합니다.
주사 시간에서 기본 시간을 뺀 후 단위 시간에 따른 요금을 계산합니다.
이때 요금은 올림을 해야 하므로 ceil 메서드를 이용합니다.
4. 정렬 후 return
차 번호를 기준으로 오름차순 정렬하여 return 합니다.
후기
카카오 문제 중 오랜만에 2레벨 같은 2레벨 문제를 만난 것 같습니다.
이게 2레벨이지... 2레벨 코스프레 멈춰! ㅠㅠ
감사합니다!
전체 코드
import Foundation
func strToMin(_ str: String) -> Int {
let time = str.split { $0 == ":" }.map { Int(String($0))! }
return time[0] * 60 + time[1]
}
func solution(_ fees:[Int], _ records:[String]) -> [Int] {
var result: [Int] = []
let lastTime = strToMin("23:59")
// print("lastTime: \(lastTime)")
var cars: [String: [Int]] = [:]
//차 기록 세팅
for record in records {
let record = record.components(separatedBy: " ")
let min = strToMin(record[0])
let number = record[1]
if let _ = cars[number] {
cars[number]?.append(min)
} else {
cars[number] = [min]
}
}
cars.forEach {
let key = $0.key
//입차 기록만 있으면 23:59에 출차 처리
if $0.value.count % 2 != 0 {
cars[key]?.append(lastTime)
}
//총 주차 시간 구하기
var minSum = 0, minNums = cars[key]!
for i in 0..<minNums.count {
if i % 2 != 0 {
minSum += (minNums[i] - minNums[i-1] )
}
}
//비용 구하기
var cost = fees[1]
if minSum > fees[0] {
cost = cost + (Int(ceil(Double(minSum - fees[0]) / Double(fees[2]))) * fees[3])
}
cars[key] = [cost]
}
//차량 번호 순서로 비용 넣기
cars.keys.sorted().forEach {
result.append(cars[$0]![0])
}
return result
}
아직은 초보 개발자입니다.
더 효율적인 코드 훈수 환영합니다!
공감과 댓글 부탁드립니다.
반응형