해당 문제를보고 코드가 너무 길어지고 시간초과로 다른 코드를 참조하면서 문제를 공부했다.
먼저 다른사람들과 나와의 공통점은 records배열을 쪼갤생각을 했다 하지만 나는 오늘 컨디션이 좋지 않아서 그런지 그다음 실행으로 옮기지 못했다.
그래서 다른 사람들의 코드를 참고하기로 했다.
그 중
이런 코드가 있었다.
매우 간결하게 정리되어있었다.
코드르 보고 다행히도 이해를 할 수 있어서 다행이었다.
먼저 설명해보자면,
records.map{ it.split(":", " ").let{ Triple(it[0].toInt()*60 + it[1].toInt(), it[2], it[3]) } }
records 배열 예를들어 ["05:34 5961 IN", "06:00 0000 IN", "06:34 0000 OUT", "07:59 5961 OUT", "07:59 0148 IN", "18:59 0000 IN", "19:09 0148 OUT", "22:59 5961 IN", "23:00 5961 OUT"]
이 배열에서 한요소씩 꺼내서 문자열을 콜론과 공백을 기준으로 분리한다.
"05:34 5961 IN"은 "05", "34", "5961", "IN"의 네 개의 요소로 분리된다.
그 후 Triple객체를 생성할 때 첫 번째 요소와 두번째 요소를 분리된 시간 정보로 조합하여 분단위로 변환한다.
- 첫 번째 요소: 5(시간) * 60 + 34(분) = 334 (분)
- 두 번째 요소: "5961" (차량 번호)
- 세 번째 요소: "IN" (입차 또는 출차 정보)
.sortedBy{it.second}//차량번호기준으로 오름차순 정렬
.groupBy{it.second} //차량번호별로 묶어줌 ==>{차량번호 = 첫째요소,셋째요소}
/*
map 의 형태는 다음과 같다.
{"0000" -> [ "06:00 0000 IN", "06:34 0000 OUT", "18:59 0000 IN" ],
"0148" -> [ "07:59 0148 IN", "19:09 0148 OUT" ],
"5961" -> [ "05:34 5961 IN", "07:59 5961 OUT", "22:59 5961 IN", "23:00 5961 OUT" ]}
*/
.map{
val time = it.value.map{ it.first }.toMutableList().apply{ if(this.size % 2 == 1) add(1439) }
.chunked(2).map{ it[1] - it[0] }.sum()
이제 차량별로 map으로 꺼내오는데 먼저 value를 사용하여 그룹화된 각 차량의 주차 기록 목록에 접근한다.
map{it.first}는 "06:00 0000 IN"에서 첫요소 즉, 주차 기록시간 정보를 가져온다.(분단위 변환된 시간)
그 후 기록시간을 수정가능한 리스트타입으로 변환한다.
.apply{ if(this.size % 2 == 1) add(1439) }를 사용하여 주차 기록이 홀수 개인 경우 마지막 시간을 1439(24시간-1분)로 추가한다. 그 후 .chunked(2)를 사용하여 시간을 2개씩 묶고, .map{it[1] - it[0]} 를 사용하여 각 시간 간격을 계산한다. 마지막으로 .sum()을 사용하여 모든 시간 간격의 합을 계산한다.
예를들어 val parkingTimes = mutableListOf(300, 360, 400, 800, 1000, 1439)=>이렇게 만들어질때
마지막으로 1439가 추가된다.(홀수개이므로)
그런다음, 시간을 2개씩 묶는다.
[[300, 360], [400, 800], [1000, 1439]]
각 시간 간격을 계산하면, 각각 [60,400,439] 가 나온다.
마지막으로 모든 시간 간격의 합을 계산하면
val totalTime = intervals.sum()
=>899가 나온다.
fees[1] 은 기본 주차 요금을 나타내고 이는 주차 시간이 기본 시간 이내일 때의 요금이다.(time - fees[0]).let{ // time-fees[0] => 추가 요금이 발생하는 주차 시간을 계산 이값이 0 이하인 경우에는 추가요금이 발생하지 않으므로 0을 반환 만약 추가 요금이 발생하는 경우에는, 추가 요금을 계산
if(it <= 0) 0
else (it / fees[2] * fees[3] + if(it % fees[2] != 0) fees[3] else 0)
만약 추가 요금이 발생하는 경우에는, 추가 요금을 계산한다. 먼저, it / fees[2]를 사용하여 추가 주차 시간을 기본 시간으로 나눈 몫을 구한다. 그리고 이를 fees[3]으로 곱하여 추가 요금을 계산한다. 또한, it % fees[2] != 0을 사용하여 추가 주차 시간이 기본 시간으로 나누어 떨어지지 않으면(즉, 나머지가 있는 경우), 추가 요금을 한 번 더 추가한다. 이렇게 하여 최종적으로 주차 요금을 계산한다.
'TIL > kotlin 알고리즘' 카테고리의 다른 글
kotlin 프로그래머스 lv2 뒤에 있는 큰 수 찾기 (0) | 2024.03.19 |
---|---|
kotlin 프로그래머스 lv2 모음사전 (0) | 2024.03.19 |
kotlin 프로그래머스 lv2 k진수에서 소수 개수 구하기 (0) | 2024.03.15 |
kotlin 프로그래머스 lv2 타겟넘버 (0) | 2024.03.15 |
kotlin 프로그래머스 lv2 피로도 (0) | 2024.03.14 |