알고리즘 CODEKATA 48 (K번째 수정렬)

오리너구리·2024년 6월 26일
0

CODEKATA

목록 보기
47/57
post-thumbnail

문제 설명

배열 array의 i번째 숫자부터 j번째 숫자까지 자르고 정렬했을 때, k번째에 있는 수를 구하려 합니다.

예를 들어 array가 [1, 5, 2, 6, 3, 7, 4], i = 2, j = 5, k = 3이라면

  1. array의 2번째부터 5번째까지 자르면 [5, 2, 6, 3]입니다.
  2. 1에서 나온 배열을 정렬하면 [2, 3, 5, 6]입니다.
  3. 2에서 나온 배열의 3번째 숫자는 5입니다.

배열 array, [i, j, k]를 원소로 가진 2차원 배열 commands가 매개변수로 주어질 때, commands의 모든 원소에 대해 앞서 설명한 연산을 적용했을 때 나온 결과를 배열에 담아 return 하도록 solution 함수를 작성해주세요.


제한사항

  • array의 길이는 1 이상 100 이하입니다.
  • array의 각 원소는 1 이상 100 이하입니다.
  • commands의 길이는 1 이상 50 이하입니다.
  • commands의 각 원소는 길이가 3입니다.

내 풀이

최종 코드

class Solution {
    fun solution(array: IntArray, commands: Array<IntArray>): List<Int> {
        var answer = mutableListOf<Int>()
        
        for(command in commands){
            val (i, j, k) = command
            val newArray = array.sliceArray(i-1 until j).sorted()
            answer.add(newArray[k-1])
        }
        return answer
    }
}

풀이 과정

처음에는 문제 또 제대로 안읽어서 이중배열인지모르고 풀려고하다가 안돼서 왜안돼슈발하고 읽어보니까 이중배열이였음~!

그래서 for문으로 commands안을 돌면서 뭘해야겠구나 했는데

어제 데이터클래스 공부하면서 구조분해 라는걸 공부했는데

그거 여기서는 못쓰나? 해서 찾아보니까 할 수 있는 것같았다.

그래서 commands의 행?을 돌면서

구조분해해서 각 요소를 i j k 에 넣고 문제필요한데 필요한 곳에 잘썼다~개편한디?


다른 사람 풀이

class Solution {
        fun solution(array: IntArray, commands: Array<IntArray>): IntArray {
            return commands.map { command ->
                array.slice(IntRange(command[0] - 1, command[1] - 1)).sorted()[command[2] - 1]
            }
                .toIntArray()
        }
    }

어떤 사람은 .map을 이용해서 풀었당

근데 array.slice하고 .sorted()까지는 알겠는데 그다음에 냅다 바로 인덱스 넣어줄수도 있군

진짜 하다보면 이게 되나? 하고해보면 되는것들이 많아서 좀 재밌다

profile
오리너구리입니다

0개의 댓글