관리 메뉴

나만을 위한 블로그

[Algorithm] 프로그래머스 - 배열의 길이를 2의 거듭제곱으로 만들기 (Kotlin) 본문

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

[Algorithm] 프로그래머스 - 배열의 길이를 2의 거듭제곱으로 만들기 (Kotlin)

참깨빵위에참깨빵 2024. 6. 28. 19:48
728x90
반응형
정수 배열 arr이 매개변수로 주어진다. arr의 길이가 2의 정수 거듭제곱이 되도록 arr 뒤에 정수 0을 추가하려고 한다. arr에 최소한의 개수로 0을 추가한 배열을 리턴하는 함수를 완성하라

 

 

arr의 길이가 2의 거듭제곱이 되도록 하는 덴 성공했지만 남은 자리에 0을 추가하는 방법을 알아내지 못했다.

아래와 같이 풀면 된다.

 

class Solution {
    fun solution(arr: IntArray): IntArray {
        val currentLength = arr.size
        var targetLength = 1

        while (targetLength < currentLength) {
            targetLength *= 2
        }

        val result = arr.copyOf(targetLength)

        return result
    }
}

 

왜 이게 되는가? 정답은 copyOf()의 작동 방식에 있었다.

 

https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/copy-of.html

 

copyOf - Kotlin Programming Language

 

kotlinlang.org

원본 배열의 복사본인 새 배열을 리턴하며 지정된 newSize로 크기가 조정된다. 복사본은 잘리거나 필요한 경우 0으로 끝을 채운다
- newSize가 원본 크기보다 작으면 복사되는 배열이 newSize로 잘린다
- newSize가 원본 크기보다 크면 복사되는 배열의 남은 요소들은 0으로 채워진다
fun ByteArray.copyOf(newSize: Int): ByteArray
fun ShortArray.copyOf(newSize: Int): ShortArray
fun IntArray.copyOf(newSize: Int): IntArray
fun LongArray.copyOf(newSize: Int): LongArray
fun FloatArray.copyOf(newSize: Int): FloatArray
fun DoubleArray.copyOf(newSize: Int): DoubleArray

// 예시
val array = intArrayOf(1, 2, 3)
val arrayCopyPadded = array.copyOf(5)
println(arrayCopyPadded.contentToString()) // [1, 2, 3, 0, 0]
val arrayCopyTruncated = array.copyOf(2)
println(arrayCopyTruncated.contentToString()) // [1, 2]

 

BooleanArray의 경우 0 대신 false, CharArray는 \u0000, Array는 null로 채워진다.

그래서 while문 탈출 후 arr의 길이를 2의 거듭제곱 수(targetLength)와 맞추기 위해 남는 공간에 0이 할당되는 것이다.

반응형
Comments