[24.06.28] TIL - 021

🎧 0. 오늘의 추천곡

요즘 김광석님의 노래가 좋습니다.

오늘은 김광석 - 너무 아픈 사랑은 사랑이 아니었음을 입니다.

지나가시면 한번 들어보세요.

💻 1. 코드 카타

오늘의 코드 카타는 주차 요금 계산 이었습니다.

오늘 문제 내용은 너무 길어서 아마 직접 보시는 게 편할 것 같습니다.

문제 내용을 간결하게 정리하면, 주차장에서 얼마나 있었는지에 따라 기본 요금과 추가 요금을 지불하게 합니다.

그리고 그 요금을 차량 번호순대로 반환해주면 됩니다.

아래는 해당 코드입니다. 심약자는 넘겨주세요.

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
    }
}

아무래도 기능이 기능이다보니, 뭔가 이렇게 짜보고 싶었기도 했고, 코드를 줄일 만한 방법이

라이브러리 함수를 사용하는 것말고는 생각이 안 나서 직관적으로 작성했습니다.

매번 느끼는 거지만, 본문이 길고, 매개변수가 컬렉션이면 항상 코드가 길어지고 어지럽네요.

⭐ 2. 코틀린 공부

오늘은 코루틴에 대해 살짝 공부했습니다.

코루틴에 대해 깊숙하게 이해했다기보다는 스레드의 개념들을 이해하는 데에 집중했습니다.

내용은 다른 분의 블로그를 참고했습니다.

기본적으로 작업을 스레드과 코루틴을 공부하면서, 블로킹/논블로킹, 동기/비동기 개념을 알아둘 필요가 있습니다.

블로킹은 한 스레드에서 작업이 끝날 때까지 그 스레드를 호출한 스레드를 못 쓰게 막는 것을 뜻합니다.

논블로킹은 막지 않고, 호출한 스레드도 다른 작업을 하고 있는 경우를 뜻합니다.

이 경우, pending 상태(성공적으로 시작했는지 확인)를 넘겨줘서 가능하다고 합니다.

동기는 호출한 스레드에 콜백을 실행합니다. 비동기는 다른 스레드에서도 콜백을 실행할 수 있습니다.

여기서 콜백은 다른 코드의 인수로서 넘겨주는 실행 가능한 코드라고 합니다.

🎯 3. 끝

오늘은 이 정도밖에 없는 것 같습니다.

사실 개인 프로젝트도 했지만, 해당 내용은 기능 추가를 위한 코드 수정이 많아서 따로 적진 않았습니다.

긔록코루틴을 공부하는데, 우선 개념부터 이해하고 가야 될 것 같아서 나머지 공부한 문법은 나중에 적어보도록 하겠습니다.

다음엔 꼭 문법을 적을 수 있었으면 좋겠습니다...

끝.

profile
여기는 공부 기록용 블로그

0개의 댓글