관리 메뉴

나만을 위한 블로그

[Algorithm] 프로그래머스 - 2차원으로 만들기 (Kotlin) 본문

알고리즘 문제 풀이/프로그래머스

[Algorithm] 프로그래머스 - 2차원으로 만들기 (Kotlin)

참깨빵위에참깨빵_ 2022. 12. 27. 20:24
728x90
반응형
정수 배열 num_list, 정수 n이 매개변수로 주어진다. num_list를 2차원 배열로 바꿔 리턴하는 solution()을 완성하라

 

 

num_list의 길이를 n으로 나눈 값만큼 배열을 만들고, num_list에서 n개씩 요소를 빼내 만든 배열에 넣는다.

주먹구구식으로 로직을 짰더니 아래처럼 되었다.

 

class Solution {
    fun solution(numList: IntArray, n: Int): Array<IntArray> {
        var count = 0
        val answer = Array(numList.size / n) { IntArray(n) }
        for (i in 0 until (numList.size / n)) {
            for (j in 0 until n) {
                answer[i][j] = numList[count]
                count++
            }
        }
        return answer
    }
}

 

count는 num_list에서 값을 빼올 인덱스다. i, j는 처음엔 0부터 시작하고 j for문이 끝나야 i for문이 작동하니까 이렇게 작동하도록 짰다.

 

  1. i, j는 모두 처음에 0이니 j for문 안의 answer[i][j]는 answer[0][0]을 가리킨다
  2. count는 처음에 0으로 선언했으니, answer[0][0]에 num_list의 0번 값을 가져와 넣는다
  3. 이후 count++가 호출되어 count 변수값이 0에서 1로 증가한다
  4. j도 +1 되어 이제 answer[0][1]을 가리키게 되고, num_list의 1번 값을 가져와 answer[0][1]에 넣는다
  5. j for문이 모두 끝났다. 이제 i for문으로 돌아가서 i가 +1 되고 j는 다시 0이 되어 answer[1][0]을 가리키게 된다
  6. i가 +1 되면 answer[1][0]에 num_list의 2번 값인 3을 가져와 넣는다
  7. 그리고 j도 +1 되고 count도 +1되어 answer[1][1]에 num_list의 3번 값인 4를 가져와 넣는다
  8. j for문이 끝나고 i for문으로 돌아가 i가 +1 된다. 이후 같은 동작을 반복한다

 

그러나 이 코드는 O(n^2)의 시간복잡도를 갖는다. 좀 더 간단하게 쓸 수 있는 방법은 없을까 고민하다가 영 생각나질 않아서 다른 사람의 풀이를 참고했다.

 

class Solution {
    fun solution(num_list: IntArray, n: Int) = num_list.toList().chunked(n)
}

 

chunked()가 뭐길래 저렇게 코드가 짧아지는지 공식 홈페이지를 확인해 봤다.

 

https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/chunked.html

 

chunked - Kotlin Programming Language

 

kotlinlang.org

이 컬렉션을 각각 지정된 크기를 초과하지 않는 List<List<T>>로 분할한다. 결과 리스트의 마지막 리스트에는 지정된 크기보다 적은 요소가 있을 수 있다
public fun <T> Iterable<T>.chunked(size: Int): List<List<T>> {
    return windowed(size, size, partialWindows = true)
}

 

리턴형이 List<List<T>>라서 매개변수인 num_list를 리스트로 만들고 호출하면 자동으로 2중 리스트로 만들어준다. 또 좋은 함수를 알아가게 되는 문제였다.

반응형
Comments