목록으로

Programming Notes

코틀린에서 배열 다루기: 최소값 제거, 그 이상의 고민

프로그래밍을 하다 보면 배열에서 특정 값을 제거해야 하는 상황에 종종 마주치게 됩니다. 특히 코틀린에서 배열은 불변성을 가지기 때문에, 값을 직접 삭제하는 것이 쉽지 않습니다. 오늘은 코틀린 배열에서 최소값을 제거하는 문제에 대한 접근 방식과, 그 과정에서 얻을 수 있는 다양한...

프로그래밍을 하다 보면 배열에서 특정 값을 제거해야 하는 상황에 종종 마주치게 됩니다. 특히 코틀린에서 배열은 불변성을 가지기 때문에, 값을 직접 삭제하는 것이 쉽지 않습니다. 오늘은 코틀린 배열에서 최소값을 제거하는 문제에 대한 접근 방식과, 그 과정에서 얻을 수 있는 다양한 고민들을 함께 나누어보려 합니다.

배열, 불변의 아름다움 뒤에 숨겨진 과제

코틀린에서 배열(Array)은 초기화된 이후 크기를 변경할 수 없는 불변(Immutable) 자료구조입니다. 이러한 불변성은 데이터의 안정성을 보장하고 예측 가능한 코드를 작성하는 데 도움을 주지만, 동시에 배열의 특정 요소를 제거하거나 수정해야 할 때는 어려움을 겪게 만들기도 합니다. 특히 "가장 작은 수 제거하기" 문제처럼, 배열 내 특정 조건에 해당하는 요소를 제거해야 할 경우, 단순히 remove 함수를 사용하는 것은 불가능합니다.

이러한 제약 사항을 극복하기 위해 몇 가지 대안적인 방법을 고려해 볼 수 있습니다. 가장 먼저 떠오르는 방법은 배열을 가변 리스트(MutableList)로 변환하여 요소를 제거한 후, 다시 배열로 되돌리는 것입니다. 이는 간단하고 직관적인 해결책이지만, 불필요한 자료구조 변환 과정이 포함되어 성능상의 오버헤드를 발생시킬 수 있습니다.

또 다른 방법은 새로운 배열을 생성하여 기존 배열에서 제거할 요소를 제외한 나머지 요소들을 복사하는 것입니다. 이 방법은 추가적인 메모리 공간을 사용하지만, 불필요한 자료구조 변환 없이 원하는 결과를 얻을 수 있습니다. 특히 코틀린의 filter 함수를 활용하면 간결하고 가독성이 좋은 코드를 작성할 수 있습니다. 예를 들어, 다음과 같이 filter 함수를 사용하여 최소값을 제외한 새로운 배열을 생성할 수 있습니다.

fun solution(arr: IntArray): IntArray {
    if (arr.size <= 1) {
        return intArrayOf(-1)
    }

    val min = arr.minOrNull() ?: return intArrayOf(-1) // 배열이 비어있을 경우를 대비
    return arr.filter { it != min }.toIntArray()
}

위 코드에서 minOrNull() 함수는 배열이 비어있을 경우 null을 반환하므로, 안전하게 null 처리 로직을 추가했습니다.

더 나은 코드를 향한 여정

코틀린 배열에서 특정 값을 제거하는 문제는 단순히 기능 구현을 넘어, 자료구조의 특성을 이해하고 효율적인 알고리즘을 선택하는 능력을 키우는 데 도움을 줍니다. 불변성을 가진 배열의 제약 사항을 극복하기 위해 가변 리스트로의 변환, 새로운 배열 생성, filter 함수 활용 등 다양한 방법을 고민하고 비교함으로써, 상황에 맞는 최적의 해결책을 선택할 수 있게 됩니다.

또한, 위에서 제시된 코드 예시처럼 코틀린의 강력한 표준 라이브러리 함수들을 활용하면 더욱 간결하고 가독성이 좋은 코드를 작성할 수 있습니다. 앞으로도 다양한 코틀린 기능을 익히고 실제 문제에 적용해 보면서, 더욱 효율적이고 아름다운 코드를 작성하는 개발자가 되도록 노력해야겠습니다.