개발자/algorithm

2021 카카오 코딩테스트 : 순위 검색

성찬쿤 2021. 8. 27. 21:06

https://programmers.co.kr/learn/courses/30/lessons/72412

 

코딩테스트 연습 - 순위 검색

["java backend junior pizza 150","python frontend senior chicken 210","python frontend senior chicken 150","cpp backend senior pizza 260","java backend junior chicken 80","python backend senior chicken 50"] ["java and backend and junior and pizza 100","pyt

programmers.co.kr

다른 사람들의 풀이를 보면 Data로 값을 저장하는 것이 아닌
"java-backend-" 와 같이 string 을 만들어서 저장하는 방법을 많이 사용했다.

하지만 kotlin의 data class 는 값이 같으면 같은 객체를 나타낼 수 있으므로 좀 더 쉽게 값들을 저장하고 관리할 수 있다.
비슷한 java class 로는 java 14부터 제공해주는 record class 가 있다.

import java.util.*

val map = HashMap<Data, ArrayList<Int>>()

class Solution {


    fun solution(info: Array<String>, query: Array<String>): IntArray {
        var answer: IntArray
        var tempAnswer = arrayListOf<Int>()

        info.forEach {
            val st = StringTokenizer(it)

            val language = st.nextToken()
            val job = st.nextToken()
            val career = st.nextToken()
            val soulFood = st.nextToken()
            val score = st.nextToken().toInt()

            for (i in arrayListOf("-", language)) {
                for (j in arrayListOf("-", job)) {
                    for (k in arrayListOf("-", career)) {
                        for (l in arrayListOf("-", soulFood)) {
                            val data = Data(i, j, k, l)

                            if (map.containsKey(data)) {
                                val arrayList = map[data]
                                arrayList!!.add(score)

                                map[data] = arrayList
                            } else {
                                map[data] = arrayListOf(score)
                            }
                        }
                    }
                }
            }
        }

        for (i in map.keys) {
            val arrayList = map[i]
            arrayList?.sort()
        }

        query.forEach {
            val st = it.split(" ")
            val language = st[0]
            val job = st[2]
            val career = st[4]
            val soulFood = st[6]
            val score = st[7].toInt()

            val checkArrayList = map[Data(language, job, career, soulFood)]

            if (checkArrayList != null) {
                var start = 0
                var end = checkArrayList!!.lastIndex

                while (start <= end) {
                    var mid = (start + end) / 2
                    if (checkArrayList[mid] < score) {
                        start = mid + 1
                    } else {
                        end = mid - 1
                    }
                }
                tempAnswer.add(checkArrayList.size - start)
            } else {
                tempAnswer.add(0)
            }
        }

        answer = tempAnswer.toIntArray()
        return answer
    }
}

data class Data(
    val language: String,
    val job: String,
    val career: String,
    val soulFood: String
)