https://school.programmers.co.kr/learn/courses/30/lessons/92341
풀이
더보기
이 문제.. ㅋㅋ.. 실무하던 사람이 오히려 잘 할 문제임.
괜히 줄이겠다고 이것저것 하다가 피보는 문제.
문제의 핵심은
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를 하는게 좀 더 코드를 줄일 수 있는 방향이 아니었을까? 싶기도. 근데 이 문제 너무 머리아파서 다른 솔루션으로 풀어보고 싶진 않소 ^-^
반응형
'스터디(programmers)' 카테고리의 다른 글
Kotlin] 프로그래머스 Lv.2, 롤케이크 자르기 (0) | 2023.04.26 |
---|---|
Java] 프로그래머스 Lv.0, 컨트롤 제트 (0) | 2023.04.21 |
Kotlin] 프로그래머스 Lv.2, 할인 행사 (0) | 2023.04.12 |
Kotlin] 프로그래머스 lv.2, JadenCase 문자열 만들기 (0) | 2023.04.05 |
Java] 프로그래머스 lv.0, 진료 순서 정하기 (0) | 2023.03.31 |