본문 바로가기

Algorithm/프로그래머스

정렬 - K번째 수

반응형

정렬 - K번째 수(programmers.co.kr/learn/courses/30/lessons/42748?language=kotlin)에 관해 Kotlin 으로 풀어봤다.

 

2018년에 같은 문제를 풀었었다.. 기억도 안나고... 해당 코드(cnwlcjf.tistory.com/35)를 봤는데 우와...

많이 발전했다? 고 느꼈다 ㅋㅋㅋ 

 

첫번째 풀이는 아래와 같다.

    fun solution(array: IntArray, commands: Array<IntArray>): IntArray {
        var answer = intArrayOf()
        
        val list = mutableListOf<Int>()
        commands.forEach { intArr ->
            val i = intArr[0]
            val j = intArr[1]
            val k = intArr[2]

            val arr = array.copyOfRange(i-1, j)
            arr.sort()
            list.add(arr[k-1])
        }
        answer = list.toIntArray()

        return answer
    }

위의 내용을 살펴보면, commands 어레이로 받은 intArray 형태를 하나씩 빼내어 예제처럼 i, j, k로 나눈다.

그 후 array에서 해당 범위를 copy해 arr에 담는다.

arr을 정렬한다. 

정렬한 데이터 중 k-1번째 값을 list에 추가한다.

list를 intArray로 변경해 결과를 리턴한다.

 

 

두번째 풀이는 아래와 같다.

    fun solution(array: IntArray, commands: Array<IntArray>): IntArray {
        var answer = intArrayOf()

        answer = commands.map { intArr ->
            array.sliceArray(IntRange(intArr[0]-1, intArr[1]-1))
            	.sortedArray()[intArr[2]-1]
        }.toIntArray()

        return answer
    }

위의 내용을 살펴보면, commands를 .map을 통해 하나씩 데이터를 가져와 list형태로 만든다.

array를 slice한 다음 array형태로 가져와 주는 sliceArray 함수를 사용해, 해당 int 범위만큼 slice한다.

sliceArray를 통해 설정해준 범위만큼 가져온 어레이를 sortedArray()를 통해 정렬하고, intArr[2]번째 값에서 1을 뺀 곳에 있는 데이터를 가져온다.

데이터를 가져와 list형태로(map함수로 인해 list형태로 만들어짐) 담아내고, toIntArray()를 통해 intArray 형태로 anwer에 담아 리턴한다.

반응형