본문 바로가기
Algorithm/문제풀이_프로그래머스

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

by Joahnee 2022. 2. 21.

요구능력 : 문제 이해능력

 

코드설명 : 

 

무슨 알고리즘을 썻다기 보다는 문제를 이해하고 어떤방식으로 풀어나갈 수 있는지를 보는 문제같다.

내가 생각하는 이 문제에서 핵심

1) 차량번호와 입출차시간을 어떻게 저장할 것인지

2) 시간계산을 분으로 바꿔서 할 줄 아는지

3) 문자열을 다룰줄 아는지

4) 출차시간이 없을때 처리를 어떻게 할 것인지

5) 나머지 올림을 어떻게 처리할 것인지

 

1)의 경우

차량번호별로 입출차시간을 배열로 받아서 입출차 시간을 저장한다.

var carNumTimeDict = [String: [Int]]()//차량번호, 입출차시간

 

2)과 3)의 경우

문자열을 분리해서 시간을 분으로 환산해서 1)의 딕셔너리에 저장해주었다.

for i in records{
        let a = i.split(separator: " ").map{String($0)}
        let time = a[0].split(separator: ":").map{Int(String($0))!}
        carNumTimeDict[a[1]]!.append(time[0] * 60 + time[1])
    }

 

4)의 경우

입/출차시간이 2으로 나누어 떨어지지 않으면 홀수개수만큼 있는 것이므로 그건 입차하고 출차는 안한게된다.

이것은 문제의 조건중 주차장에 이미 있는 차량이 다시 입차되는 경우는 없다고 했으므로 보장된다.

그러므로 23:59를 분으로 환산해서 딕셔너리에 추가해준다.

for i in carNumTimeDict{
        if i.value.count % 2 != 0{
            carNumTimeDict[i.key]?.append((23 * 60) + 59)
        }
    }

 

5)의 경우

cal = (구한 총 시간 - 기본 시간)에서 단위시간을 나누었을때 0 보다 크면 올림을 해주기 위해 temp를 true로 두고

cal 을 나눠준 후에 temp가 true이면 cal에 1을 더해서 올림을 해주었다.

for i in 0..<arr.count{
        if arr[i] <= basicTime{
            result[i] = basicFee
        }else{
            var temp = false
            cal = (arr[i] - basicTime)
            if cal % unitTime > 0 {
                temp = true
            }
            cal = cal / unitTime
            if temp{
                cal += 1
            }
            result[i] = (basicFee + (cal * unitFee))
        }
    }

 

후기 : 구현문제는 귀찮아서 여태 안풀었었는데 카카오 풀어봐야겠다고 생각해서 한번풀어봤다.

빨리 백준에 있는 구현도 하나씩 풀어봐야겠다.

import Foundation

//fees[0] = 기본시간(분)
//fees[1] = 기본요금(원)
//fees[2] = 단위시간(분)
//fees[3] = 단위요금(원)
//records = 시각 차량번호 내역

func solution(_ fees:[Int], _ records:[String]) -> [Int] {
    let basicTime = fees[0]
    let basicFee = fees[1]
    let unitTime = fees[2]
    let unitFee = fees[3]
    
    var carNumTimeDict = [String: [Int]]()//차량번호, 입출차시간
    
    
    for i in records{
        let a = i.split(separator: " ").map{String($0)}
        carNumTimeDict[a[1]] = []
    }
    var result = Array(repeating: 0, count: carNumTimeDict.keys.count)//아래에서 += 해줘야되서 차의 개수만큼 배열생성
    var arr = Array(repeating: 0, count: carNumTimeDict.keys.count) //요금 계산할 분 누적시키기
    for i in records{
        let a = i.split(separator: " ").map{String($0)}
        let time = a[0].split(separator: ":").map{Int(String($0))!}
        carNumTimeDict[a[1]]!.append(time[0] * 60 + time[1])
    }
    
    for i in carNumTimeDict{
        if i.value.count % 2 != 0{
            carNumTimeDict[i.key]?.append((23 * 60) + 59)
        }
    }
    var idx = 0 //result에 들어가는 순서맞추기위한인덱스
    
    for i in carNumTimeDict.sorted(by: {$0.key < $1.key}){
        for j in stride(from: i.value.count - 1, through: 0, by: -1) {
            if j % 2 != 0 && j - 1 >= 0{
                let diff = i.value[j] - i.value[j - 1]
                arr[idx] += diff
            }

        }
       idx += 1
    }
    var cal = 0
    for i in 0..<arr.count{
        if arr[i] <= basicTime{
            result[i] = basicFee
        }else{
            var temp = false
            cal = (arr[i] - basicTime)
            if cal % unitTime > 0 {
                temp = true
            }
            cal = cal / unitTime
            if temp{
                cal += 1
            }
            result[i] = (basicFee + (cal * unitFee))
        }
    }

    return result
}

 

댓글