fun solution(fees: IntArray, records: Array<String>): IntArray {
val carNumberToRecord = TreeMap<String, MutableList<String>>()
for (record in records) {
val splitRecord = record.split(" ")
val parkingInfos = carNumberToRecord[splitRecord[1]]?: mutableListOf()
parkingInfos.add(splitRecord[0])
carNumberToRecord[splitRecord[1]] = parkingInfos
}
val sortedCarNumberToRecord = carNumberToRecord.toSortedMap()
val answer = IntArray(carNumberToRecord.size)
var answerIndex = 0
for (carIter in sortedCarNumberToRecord) {
val parkingTimes = carIter.value
if (parkingTimes.size % 2 == 1)
parkingTimes.add("23:59")
var parkingTimesIndex = 0
var totalUsingTime = 0
var totalFee = 0
while (parkingTimesIndex < parkingTimes.size) {
val inTime = parkingTimes[parkingTimesIndex++].split(":")
val outTime = parkingTimes[parkingTimesIndex++].split(":")
val inTimeToMinutes = (inTime[0].toInt() * 60) + inTime[1].toInt()
val outTimeToMinutes = (outTime[0].toInt() * 60) + outTime[1].toInt()
totalUsingTime += outTimeToMinutes - inTimeToMinutes
}
if(totalUsingTime <= fees[0])
totalFee = fees[1]
else{
totalUsingTime -= fees[0]
totalFee += fees[1] + Math.ceil(totalUsingTime.toDouble() / fees[2]).toInt() * fees[3]
}
answer[answerIndex++] = totalFee
}
return answer
}
풀이과정
1. records를 반복문을 돌면서 map(carNumberToRecord, key : 차량번호, value : List(입출입 시간들))에 추가한다.
2. map의 list를 2개씩(입차, 출차) 읽으면서 추가한다.(입력 값이 정렬되어 있기 때문에 순서대로 읽으면 된다.)
2.1. 시:분 으로 주어진 시간을 분단위로 환산하고 입차 - 출자 시간으로 이용시간을 계산한다.
3. 문제에 주어진 계산 방법에 따라 이용요금을 계산한다.
포인트
- 입차, 출차시간이 이미 정렬되어 있기 때문에 List를 따로 정렬해서 계산할 필요가 없다.
- TreeMap을 사용했을 때 정렬 방식을 정의하지 않으면 key값으로 오름차순 정렬하기 때문에 답으로 쓰이는 배열에 순서대로 넣으면 된다.
'TLI > 코드카타' 카테고리의 다른 글
2024.07.01 TIL 코트카타 99번(롤케이크 자르기) (0) | 2024.07.01 |
---|---|
2024.06.29 TIL 코트카타 97번(모음사전) (0) | 2024.06.29 |
2024.06.27 TIL 코트카타 95번(k진수에서 소수 개수 구하기) (0) | 2024.06.27 |
2024.06.20 TIL 코트카타 88번(행열의 곱셈) (0) | 2024.06.20 |
2024.06.18 TIL 코트카타 86번(H-Index) (2) | 2024.06.18 |