키오스크 프로젝트를 진행하면서 오늘은 알고리즘 문제 하나를 풀게 되었습니다. 문제는 간단해 보였지만, 코틀린의 배열 특성 때문에 예상치 못한 함정에 빠지기도 했던 경험을 공유하려 합니다. 문제는 정수 배열에서 가장 작은 수를 제거하고 남은 배열을 반환하는 함수를 작성하는 것이었습니다. 조건은 배열의 길이가 1 이상이며, 배열 내의 모든 원소는 서로 다른 값을 갖는다는 것이었습니다. 예시로 [4, 3, 2, 1]이 입력되면 [4, 3, 2]를, [10]이 입력되면 [-1]을 반환해야 했습니다.
처음에는 단순하게 생각했습니다. for문을 이용해서 배열을 순회하며 최솟값을 찾고, remove 와 같은 메서드를 사용해서 최솟값을 제거하면 될 것이라고 생각했습니다. 하지만 코틀린의 IntArray는 값을 직접 제거할 수 없는 불변(immutable) 배열이라는 사실을 깨달았습니다. remove 메서드를 사용하려면 MutableList 와 같이 값을 변경할 수 있는 자료구조로 변환해야 했습니다. 이 때문에 처음 생각했던 단순한 접근 방식은 막히게 되었습니다.
그래서 두 가지 대체 방안을 고려해 보았습니다. 첫 번째는 IntArray를 MutableList로 변환하여 최솟값을 제거한 후 다시 IntArray로 변환하는 방법입니다. 이 방법은 간결하고 이해하기 쉬운 장점이 있지만, 자료구조 변환 과정에서 불필요한 오버헤드가 발생할 수 있다는 단점이 있습니다. 두 번째는 최솟값을 제외한 나머지 원소들을 새로운 배열에 복사하는 방법입니다. 이 방법은 불필요한 자료구조 변환을 피할 수 있지만, 새로운 배열을 생성해야 하므로 메모리 사용량이 조금 더 늘어날 수 있습니다. 결국, 두 번째 방법이 조금 더 효율적이라고 판단하여 최솟값을 찾고, 이를 제외한 나머지 요소들을 새로운 배열에 담는 방식으로 문제를 해결했습니다. 배열의 길이가 1인 경우에는 [-1]을 반환하는 예외 처리도 추가했습니다. 처음에는 간단해 보였던 문제였지만, 코틀린의 자료구조 특성을 제대로 이해하고, 효율적인 알고리즘을 선택하는 것이 중요하다는 것을 다시 한번 느꼈습니다. 키오스크 개발 과정에서 이러한 작은 알고리즘 문제들이 모여 전체적인 성능에 영향을 미칠 수 있기 때문에, 앞으로 더욱 주의 깊게 알고리즘을 설계하고 구현해야겠습니다.