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
)

'개발자 > algorithm' 카테고리의 다른 글

백준 4779번 : 칸토어 집합 (kotlin)  (0) 2021.08.28
HackerRank, Binary Numbers (Java)  (0) 2021.01.25
백준 19279번 : 최대 힙 (java)  (0) 2021.01.12
LeetCode, Valid Parentheses (Java)  (0) 2021.01.09
LeetCode, Rotate Image (Java)  (0) 2021.01.08

+ Recent posts