요즘 김광석님의 노래가 좋습니다.
오늘은 김광석 - 너무 아픈 사랑은 사랑이 아니었음을 입니다.
지나가시면 한번 들어보세요.
오늘의 코드 카타는 주차 요금 계산 이었습니다.
오늘 문제 내용은 너무 길어서 아마 직접 보시는 게 편할 것 같습니다.
문제 내용을 간결하게 정리하면, 주차장에서 얼마나 있었는지에 따라 기본 요금과 추가 요금을 지불하게 합니다.
그리고 그 요금을 차량 번호순대로 반환해주면 됩니다.
아래는 해당 코드입니다. 심약자는 넘겨주세요.
class Solution {
fun solution(fees: IntArray, records: Array<String>): IntArray {
val recordList: MutableList<Array<String>>
= MutableList(records.size) { StringBuilder(records[it]).split(" ").toTypedArray() }
val numList: ArrayList<String> = arrayListOf()
recordList.forEach {
if(!numList.contains(it[1])) numList += it[1]
}
var answer = IntArray(numList.size) { 0 }
numList.sort()
var answerList = MutableList(numList.size) { 0 }
var answerBoolList = MutableList(numList.size) { false }
var index = 0
var sb = StringBuilder()
recordList.forEach {
index = numList.indexOf(it[1])
sb.append(it[0])
when(it[2]) {
"IN" -> {
answerBoolList[index] = true
answerList[index] += sb.substring(0, 2).toInt() * 60 + sb.substring(3, 5).toInt()
}
"OUT" -> {
answerBoolList[index] = false
answerList[index] =
sb.substring(0, 2).toInt() * 60 + sb.substring(3, 5).toInt() - answerList[index]
answer[index] += answerList[index]
answerList[index] = 0
}
}
sb.delete(0, 5)
}
repeat(answerBoolList.size) {
if(answerBoolList[it] == true) {
sb.append("23:59")
answerBoolList[it] = false
answerList[it] =
sb.substring(0, 2).toInt() * 60 + sb.substring(3, 5).toInt() - answerList[it]
answer[it] += answerList[it]
answerList[it] = 0
}
}
repeat(answer.size) {
if(answer[it] - fees[0] <= 0) {
answer[it] = fees[1]
}
else {
answer[it] =
if((answer[it] - fees[0]) % fees[2] == 0)
fees[1] + ((answer[it] - fees[0]) / fees[2]) * fees[3]
else
fees[1] + ((answer[it] - fees[0]) / fees[2] + 1) * fees[3]
}
}
return answer
}
}
아무래도 기능이 기능이다보니, 뭔가 이렇게 짜보고 싶었기도 했고, 코드를 줄일 만한 방법이
라이브러리 함수를 사용하는 것말고는 생각이 안 나서 직관적으로 작성했습니다.
매번 느끼는 거지만, 본문이 길고, 매개변수가 컬렉션이면 항상 코드가 길어지고 어지럽네요.
오늘은 코루틴에 대해 살짝 공부했습니다.
코루틴에 대해 깊숙하게 이해했다기보다는 스레드의 개념들을 이해하는 데에 집중했습니다.
내용은 다른 분의 블로그를 참고했습니다.
기본적으로 작업을 스레드과 코루틴을 공부하면서, 블로킹/논블로킹, 동기/비동기 개념을 알아둘 필요가 있습니다.
블로킹은 한 스레드에서 작업이 끝날 때까지 그 스레드를 호출한 스레드를 못 쓰게 막는 것을 뜻합니다.
논블로킹은 막지 않고, 호출한 스레드도 다른 작업을 하고 있는 경우를 뜻합니다.
이 경우, pending 상태(성공적으로 시작했는지 확인)를 넘겨줘서 가능하다고 합니다.
동기는 호출한 스레드에 콜백을 실행합니다. 비동기는 다른 스레드에서도 콜백을 실행할 수 있습니다.
여기서 콜백은 다른 코드의 인수로서 넘겨주는 실행 가능한 코드라고 합니다.
오늘은 이 정도밖에 없는 것 같습니다.
사실 개인 프로젝트도 했지만, 해당 내용은 기능 추가를 위한 코드 수정이 많아서 따로 적진 않았습니다.
긔록코루틴을 공부하는데, 우선 개념부터 이해하고 가야 될 것 같아서 나머지 공부한 문법은 나중에 적어보도록 하겠습니다.
다음엔 꼭 문법을 적을 수 있었으면 좋겠습니다...
끝.