본문 바로가기
스터디(programmers)

Kotlin] 프로그래머스 Lv.2, 주차 요금 계산

by 김마리님 2023. 4. 19.

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

 

프로그래머스

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

programmers.co.kr

 

 

풀이

더보기

이 문제.. ㅋㅋ.. 실무하던 사람이 오히려 잘 할 문제임.

괜히 줄이겠다고 이것저것 하다가 피보는 문제.

 

문제의 핵심은 

1. 차들은 1회 이상 언제든지 들어왔다가 나갔다가 할 수 있음.

2. 23:59 내로 출차되지 않는 자동차도 있음.

3. 번호가 작은 순서로 정렬해서 결과를 리턴해야함.

4. 초과 주차는 무조건 올림을 해야한다.

 

1번의 케이스를 위해 커스텀 자료형을 만들고 hashmap을 통해 총합 시간을 관리한다.

 

입차할 때 자동차의 번호(키)와 자료형(value)에 입차시간을 등록하고, 출차할 때 받은 시간과 입차 시간을 빼서 자료형의 누적 시간에 더한다.

그리고 값을 계산하기 전 입차시간이 존재한다면 아직 출차 전이므로 최종 시간인 23:59 전에 자료형에 등록된 입차시간을 빼서 누적시간에 더한다.

누적시간에 요금을 더하는데, 이 때 주의할 점은 요금이 초과 주차 단위가 10분 단위일때, 15분 주차한 것은 20분으로 쳐야한다는 점, 즉 올림으로 값을 쳐야한다는 점이다. 따라서 celi(15/10) * 600을 해야 2 * 600이 된다는 점이다.

 

이를 코드로 정리하면

import kotlin.math.ceil

class Solution {
    fun solution(fees: IntArray, records: Array<String>): IntArray {
        var car = HashMap<String, Cars>()

        records.forEach {
            var record = it.split(" ")
            if(record[2] == "IN") {
                if(car.containsKey(record[1])) {
                    var cars = car[record[1]]
                    cars?.inTime = record[0]
                } else {
                    var cars = Cars()
                    cars?.inTime = record[0]
                    car[record[1]] = cars
                }
            } else {
                var cars = car[record[1]]
                var inHourTime = cars?.inTime!!.split(":").map { time -> time.toInt() }
                var outHourTime = record[0].split(":").map { time -> time.toInt() }

                var hour = outHourTime[0] - inHourTime[0]
                var minute = outHourTime[1] - inHourTime[1]

                cars.accuTime += hour * 60 + minute
                cars.inTime = ""

            }
        }

        var answer = mutableListOf<Int>()

        car.toSortedMap().forEach {

            if(it.value.inTime != "") {
                var inHourTime = it.value.inTime!!.split(":").map { time -> time.toInt() }

                var hour = 23 - inHourTime[0]
                var minute = 59 - inHourTime[1]

                it.value.accuTime += hour * 60 + minute
                it.value.inTime = ""

            }

            var totalFee = if(it.value.accuTime <= fees[0]) {
                fees[1]
            } else {
                fees[1] + ceil((it.value.accuTime - fees[0]) / fees[2].toDouble()) * fees[3]
            }
            answer.add(totalFee.toInt())

        }


        return answer.toIntArray()
    }
}

// 입차일때는 inTime 값 변경
// 출차일때는 inTime 초기화, accuTime 값 추가
class Cars {
    var inTime = ""
    var accuTime = 0
}

 

 

++) 풀고 나서 생각한건데 split[" "][1] (차량 번호) 를 기준으로 groupBy를 하는게 좀 더 코드를 줄일 수 있는 방향이 아니었을까? 싶기도. 근데 이 문제 너무 머리아파서 다른 솔루션으로 풀어보고 싶진 않소 ^-^

반응형