코틀린 코딩테스트 강좌, 부녀회장이 될 테야

코딩테스트는 많은 기업들이 후보자를 평가하기 위해 사용하는 중요한 도구입니다.
특히 알고리즘 문제는 코딩 실력과 문제 해결 능력을 측정하는 데 효과적입니다.
이번 강좌에서는 ‘부녀회장이 될 테야’라는 알고리즘 문제를 다루어 보겠습니다.
이 문제를 통해 코틀린의 기본 문법과 알고리즘적 사고를 발전시킬 수 있을 것입니다.
문제의 본질, 접근 방법, 코드 구현 및 최적화 방법에 대해 자세히 설명하겠습니다.

문제 설명

어느 날, 부녀회장이 되고 싶은 한 사람은 아파트에 살고 있습니다.
이 아파트의 구조는 다음과 같습니다:

  • 0층: 1호, 2호, 3호, …, n호에 거주하는 사람 수는 각각 1명입니다.
  • 1층: 1호에는 1층 사람 수를 더해서 2층 사람 수를 만들고, …
  • k층: n호에는 0층부터 k층까지 각 층의 인원 수를 모두 더한 수가 거주합니다.

이러한 아파트 구조에서, 주어진 층과 호수에 따라 해당 호수에 거주하는 인원 수를 구하는 문제입니다.

입력 형식

  • 첫째 줄: 테스트 케이스의 수 T (1 ≤ T ≤ 10)
  • 각 테스트 케이스마다 두 개의 정수 K (0 ≤ K ≤ 14)와 N (1 ≤ N ≤ 14)가 주어집니다.

출력 형식

각 테스트 케이스마다 해당 호수에 거주하는 사람 수를 출력합니다.

문제 접근 방법

이 문제는 동적 계획법(Dynamic Programming)을 이용하여 해결할 수 있습니다.
다음과 같은 방법으로 접근할 수 있습니다:

  1. 아파트 구조의 특성을 이해하고 0층의 각 호수에는 1명씩 거주하고 있다는 것을 기억합니다.
    그러면 1층의 사람 수는 0층의 사람 수를 반복적으로 더하는 방식으로 결정됩니다.
  2. K층의 N호수에 거주하는 인원 수는 (K-1)층의 1호 + (K-1)층의 2호 + … + (K-1)층의 N호수의 합입니다.
    이는 재귀적인 성질을 가지고 있기 때문에 재귀 호출을 통해 해결할 수 있습니다.
  3. 구현 시, 특정 층과 호수에 대한 인원 수를 저장하는 2차원 배열을 생성하여 결과를 메모이제이션(memoization)할 수 있습니다.

코드 구현

아래는 위의 알고리즘을 코틀린으로 구현한 코드입니다.


        fun main() {
            val t = readLine()!!.toInt()
            val results = IntArray(t)

            for (i in 0 until t) {
                val (k, n) = readLine()!!.split(' ').map { it.toInt() }
                results[i] = calculateResidents(k, n)
            }

            for (result in results) {
                println(result)
            }
        }

        fun calculateResidents(k: Int, n: Int): Int {
            // 14층 14호 구조체를 초기화
            val dp = Array(15) { IntArray(15) }

            // 0층은 1명씩 거주
            for (j in 1..14) {
                dp[0][j] = 1
            }

            // 각 층과 각 호수에 대해 반복
            for (i in 1..k) {
                for (j in 1..n) {
                    // (i-1)층 j호의 사람 수를 더함
                    for (m in 1..j) {
                        dp[i][j] += dp[i - 1][m]
                    }
                }
            }

            return dp[k][n] // k층 n호의 주민 수 반환
        }
    

코드 설명

위 코드에서 `calculateResidents` 함수는 주어진 K층 N호에 거주하는 인원 수를 계산합니다.
이 함수는 다음과 같은 단계로 진행됩니다:

  1. 2차원 배열 `dp`를 만들어 15×15 구조를 초기화합니다.
  2. 0층에서는 모든 호수에 1명씩 거주하고 있음을 설정합니다.
  3. K층과 N호에 대해서, 모든 호수에서 (K-1)층의 인원 수를 합산하여 누적합니다.
  4. 최종적으로 DP 테이블에서 K층 N호의 사람 수를 반환합니다.

시간 복잡도 분석

이 문제의 시간 복잡도는 O(K * N^2)입니다. K는 최대 14이므로,
전체적인 시간 복잡도는 상수로 취급할 수 있습니다. 따라서 문제를 빠르고 효율적으로 해결할 수 있습니다.
코드를 최적화하고 메모리를 절약하면서 구현하는 것이 중요합니다.

결론

‘부녀회장이 될 테야’ 문제는 동적 계획법을 통해 해결할 수 있는 전형적인 알고리즘 문제입니다.
코틀린의 문법을 활용하고, DP를 통해 문제를 해결하는 과정에서 알고리즘적 사고를 기를 수 있습니다.
이러한 문제를 풀며 코딩테스트에서의 경쟁력을 높일 수 있을 것입니다.
이 강좌를 통해 배운 내용이 실제 코딩테스트 준비에 도움이 되기를 바랍니다!

코틀린 코딩테스트 강좌, 병합 정렬

안녕하세요, 코틀린 코딩테스트 강좌에 오신 것을 환영합니다. 이번 강좌에서는 ‘병합 정렬(Merge Sort)’ 알고리즘에 대해 자세히 알아보고, 이를 활용하여 실제 문제를 해결해보겠습니다. 병합 정렬은 비제로 복잡도를 가진 효율적인 정렬 알고리즘 중 하나로, 대규모 데이터 세트를 정렬할 때 매우 유용합니다.

1. 병합 정렬 소개

병합 정렬은 분할 정복(Divide and Conquer) 접근 방식을 사용하는 알고리즘으로, 배열을 반으로 나눈 후 각 절반을 재귀적으로 정렬하고, 정렬된 두 배열을 합쳐 최종적으로 정렬된 배열을 생성합니다. 이 과정은 크게 세 단계로 나눌 수 있습니다:

  1. 배열을 중간 기준으로 반으로 나누기
  2. 각 하위 배열을 재귀적으로 정렬하기
  3. 정렬된 두 하위 배열을 합쳐 최종 정렬된 배열 만들기

2. 병합 정렬의 시간 복잡도

병합 정렬의 시간 복잡도는 최악, 평균, 최선 모두 O(n log n)입니다. 이는 원소의 개수에 따라 정렬 과정이 로그 배수만큼 증가함을 의미합니다. 공간 복잡도는 O(n)로, 추가적인 배열을 생성하여 정렬된 결과를 저장하는 방식 때문에 추가적인 메모리를 필요로 합니다.

3. 병합 정렬의 알고리즘 이해하기

병합 정렬 알고리즘을 이해하기 위해 다음과 같은 단계를 고려해봅시다:

3.1. 알고리즘 단계

1. 배열이 1개 이하의 요소를 가지면 이미 정렬된 상태이므로 반환.
2. 배열을 중간 인덱스를 기준으로 두 개의 서브 배열로 나누기.
3. 각 서브 배열에 대해 재귀적으로 병합 정렬 함수를 호출.
4. 두 정렬된 서브 배열을 병합하여 하나의 정렬된 배열을 생성.

3.2. 병합 정렬 구현하기

이제 위의 절차를 코틀린으로 구현해 보겠습니다. 다음은 병합 정렬을 구현한 간단한 코드 예제입니다:


fun mergeSort(arr: IntArray): IntArray {
    if (arr.size < 2) {
        return arr
    }

    val mid = arr.size / 2
    val left = mergeSort(arr.sliceArray(0 until mid))
    val right = mergeSort(arr.sliceArray(mid until arr.size))
    return merge(left, right)
}

fun merge(left: IntArray, right: IntArray): IntArray {
    val merged = IntArray(left.size + right.size)
    var i = 0
    var j = 0
    var k = 0

    while (i < left.size && j < right.size) {
        if (left[i] <= right[j]) {
            merged[k++] = left[i++]
        } else {
            merged[k++] = right[j++]
        }
    }
    
    while (i < left.size) {
        merged[k++] = left[i++]
    }
    
    while (j < right.size) {
        merged[k++] = right[j++]
    }

    return merged
}

4. 알고리즘 문제: 주어진 배열 정렬하기

이번 문제는 주어진 배열을 병합 정렬을 통해 정렬하는 것입니다. 입력으로는 정수로 이루어진 배열이 주어지고, 이 배열을 정렬하여 출력합니다. 문제는 아래와 같습니다:

문제 설명

주어진 배열을 병합 정렬 알고리즘을 사용하여 오름차순으로 정렬하시오.

입력
- 첫 줄에 배열의 크기 N (1 ≤ N ≤ 1000) 가 주어짐.
- 두 번째 줄에 N개의 정수로 이루어진 배열이 주어진다.

출력
- 오름차순으로 정렬된 N개의 정수를 출력한다.

문제 해결 과정

이 문제를 해결하기 위해 다음 단계를 따릅니다:

  1. 입력받은 배열을 정렬하기 위해 병합 정렬 함수를 호출합니다.
  2. 정렬된 배열을 출력합니다.

4.1. 문제를 해결하는 코드


fun main() {
    val n = readLine()!!.toInt()
    val arr = readLine()!!.split(" ").map { it.toInt() }.toIntArray()

    val sortedArr = mergeSort(arr)

    println(sortedArr.joinToString(" "))
}

5. 예제

예를 들어, 다음과 같은 입력이 주어진다고 가정해 보겠습니다:

입력:
5
4 2 3 1 5

이 입력의 출력은 다음과 같아야 합니다:

출력:
1 2 3 4 5

6. 마무리

병합 정렬 알고리즘에 대한 이해는 코딩 테스트에서 매우 중요합니다. 이 알고리즘은 실제로 여러 문제를 해결하는 데 활용되므로, 충분한 연습이 필요합니다. 이번 강좌를 통해 병합 정렬의 기본 개념과 구현 방법, 실제 코딩 테스트 문제를 해결하는 방법에 대해 알아보았습니다. 앞으로 더욱 다양한 알고리즘과 문제 해결법에 대해 다룰 예정이니 기대해 주세요!

코틀린 코딩테스트 강좌, 벨만-포드

1. 서론

코딩 테스트는 현대의 기술 직군에서 필수적인 능력을 평가하는 중요한 단계입니다. 특히 그래프 이론은 알고리즘 문제에서 흔히 요구되는 주제이며, 그중에서도 벨만-포드 알고리즘은 단일 출발점에서 최단 경로를 찾는 문제를 해결하는 데 널리 사용됩니다. 이번 글에서는 코틀린을 사용하여 벨만-포드 알고리즘을 구현하고, 문제를 해결하는 과정을 자세히 설명하겠습니다.

2. 벨만-포드 알고리즘 소개

벨만-포드 알고리즘은 주어진 그래프에서 하나의 정점에서 다른 모든 정점으로의 최단 경로를 찾는 알고리즘입니다. 이 알고리즘은 특히 음의 가중치를 가진 간선이 존재할 때 유용합니다. 벨만-포드 알고리즘은 다음과 같은 단계로 작동합니다:

  • 시작 정점의 거리 값을 0으로 초기화하고, 나머지 정점의 거리 값을 무한대로 설정합니다.
  • 그래프의 모든 간선을 |V| – 1번 반복하여, 각 간선(u, v)에 대해 distance[v] = min(distance[v], distance[u] + weight(u, v))을 수행합니다.
  • 마지막으로, 음의 가중치 사이클이 있는지 확인하기 위해 모든 간선을 한 번 더 검사합니다.

3. 문제 설명

문제: 최단 경로 찾기

다음과 같은 그래프가 있다. 정점과 간선은 아래와 같이 주어졌다. 각 간선의 가중치는 표시되어 있다.

        정점:
        0, 1, 2, 3, 4

        간선:
        0 -> 1 (4)
        0 -> 2 (1)
        1 -> 2 (2)
        1 -> 3 (5)
        2 -> 3 (8)
        3 -> 4 (3)
        2 -> 4 (7)
    

0번 정점에서 다른 모든 정점으로의 최단 경로를 계산하라.

4. 문제 풀이 과정

4.1 입력 데이터 설계

먼저, 위의 그래프를 코드로 표현하기 위해, 정점과 간선을 데이터 구조로 정의해야 합니다. 코틀린에서는 리스트와 데이터 클래스를 사용하여 쉽게 구현할 수 있습니다.

4.2 코틀린 데이터 클래스 정의

        data class Edge(val u: Int, val v: Int, val weight: Int)
    

4.3 벨만-포드 알고리즘 구현

        fun bellmanFord(edges: List, vertexCount: Int, startVertex: Int): IntArray {
            val distance = IntArray(vertexCount) { Int.MAX_VALUE }
            distance[startVertex] = 0

            for (i in 1 until vertexCount) {
                for (edge in edges) {
                    if (distance[edge.u] != Int.MAX_VALUE && distance[edge.u] + edge.weight < distance[edge.v]) {
                        distance[edge.v] = distance[edge.u] + edge.weight
                    }
                }
            }

            // 음의 가중치 사이클 검증
            for (edge in edges) {
                if (distance[edge.u] != Int.MAX_VALUE && distance[edge.u] + edge.weight < distance[edge.v]) {
                    throw IllegalArgumentException("음의 가중치 사이클 존재")
                }
            }

            return distance
        }
    

5. 전체 구현

        fun main() {
            val edges = listOf(
                Edge(0, 1, 4),
                Edge(0, 2, 1),
                Edge(1, 2, 2),
                Edge(1, 3, 5),
                Edge(2, 3, 8),
                Edge(3, 4, 3),
                Edge(2, 4, 7)
            )
            
            val result = bellmanFord(edges, 5, 0)
            println("0번 정점에서 다른 정점까지의 최단 거리: ${result.joinToString(", ")}")
        }
    

6. 출력 결과

위 코드를 실행하면 0번 정점에서 다른 모든 정점까지의 최단 거리를 알 수 있습니다. 기대하는 결과는 다음과 같습니다:

        0번 정점에서 다른 정점까지의 최단 거리: 0, 3, 1, 11, 10
    

7. 결론

벨만-포드 알고리즘을 사용하여 최단 경로 문제를 해결하는 과정을 살펴보았습니다. 이 알고리즘은 단순하면서도 강력한 기능을 제공합니다. 특히 음의 가중치가 있을 때 유용하게 사용될 수 있음을 강조하고 싶습니다. 코틀린을 이용해 구현해보면서, 알고리즘의 작동 방식을 더욱 잘 이해할 수 있었을 것입니다. 코딩 테스트를 준비하며 벨만-포드 알고리즘을 실습해보세요!

코틀린 코딩테스트 강좌, 버블 정렬

안녕하세요! 이번 포스팅에서는 코틀린을 이용한 코딩 테스트 문제 풀이에 대해 다뤄보겠습니다. 주제는 배열을 정렬하는 대표적인 방법인 버블 정렬(Bubble Sort)입니다. 본 강좌에서는 버블 정렬의 이론적인 배경과 코드를 다룰 예정입니다.

버블 정렬이란?

버블 정렬은 정렬 알고리즘 중 가장 간단한 형태로, 주어진 데이터의 가장 큰 수가 마지막으로 ‘표면으로 떠오른다’는 의미에서 ‘버블(Bubble)’이라는 이름이 붙었습니다. 이 방법은 배열을 여러 번 순회하면서 인접한 두 개의 요소를 비교하여 정렬하는 방식입니다.

버블 정렬의 작동 방식

  1. 배열의 첫 번째 요소와 두 번째 요소를 비교합니다.
  2. 만약 첫 번째 요소가 두 번째 요소보다 크면, 두 요소의 위치를 바꿉니다.
  3. 이 과정을 배열의 끝까지 반복합니다.
  4. 이 과정이 완료되면, 마지막 요소는 가장 큰 값으로 위치 고정됩니다.
  5. 위 과정을 정렬이 완료될 때까지 반복합니다.

버블 정렬의 시간 복잡도

버블 정렬의 최악의 경우 시간 복잡도는 O(n²)입니다. 이는 배열의 길이가 n일 때, n번의 반복에서 각 반복마다 n-1번의 비교가 이루어지기 때문입니다. 그러나 최선의 경우(이미 정렬된 경우)에는 O(n)의 시간 복잡도를 가집니다.

문제 설명

아래의 문제를 풀어 보겠습니다.

문제: 주어진 정수 배열을 버블 정렬 알고리즘을 사용하여 오름차순으로 정렬하세요.

문제 해결 과정

이제 문제를 해결하기 위해 코틀린 코드를 작성해 보겠습니다. 먼저 버블 정렬의 기본 로직을 정리합니다.

버블 정렬 구현하기


fun bubbleSort(arr: IntArray): IntArray {
    val n = arr.size
    for (i in 0 until n - 1) {
        for (j in 0 until n - i - 1) {
            // 인접한 두 요소를 비교하여 정렬
            if (arr[j] > arr[j + 1]) {
                // 스와핑
                val temp = arr[j]
                arr[j] = arr[j + 1]
                arr[j + 1] = temp
            }
        }
    }
    return arr
}
    

위 코드는 정수 배열을 입력받아 그것을 오름차순으로 정렬한 후 반환하는 함수입니다. 내부에 두 개의 for 문을 사용하여 배열을 순회하면서 요소들을 비교하고 위치를 서로 교환합니다.

실행 예시

이제 만들어진 함수를 호출하여 실제 정렬이 잘 이루어지는지 확인해 보겠습니다.


fun main() {
    val array = intArrayOf(64, 34, 25, 12, 22, 11, 90)
    println("정렬 전 배열: ${array.joinToString(", ")}")
    val sortedArray = bubbleSort(array)
    println("정렬 후 배열: ${sortedArray.joinToString(", ")}")
}
    

위와 같은 코드를 실행하면 아래와 같은 결과를 얻을 수 있습니다.


정렬 전 배열: 64, 34, 25, 12, 22, 11, 90
정렬 후 배열: 11, 12, 22, 25, 34, 64, 90
    

버블 정렬의 최적화

기본적으로 구현된 버블 정렬 코드에서는 매 반복마다 배열의 끝까지 비교를 진행하는데, 이는 성능 개선에 비효율적일 수 있습니다. 따라서 어떤 개념을 통해 버블 정렬을 최적화할 수 있는지 살펴보겠습니다.

플래그 변수를 이용한 최적화

배열이 이미 정렬되어 있을 경우, 더 이상 반복할 필요가 없습니다. 이를 해결하기 위해 ‘스왑이 이루어졌는지 여부’를 기록하는 변수를 설정할 수 있습니다. 만약 한 번도 스왑이 이루어지지 않았다면, 배열이 정렬되었다고 판단할 수 있습니다.


fun optimizedBubbleSort(arr: IntArray): IntArray {
    val n = arr.size
    var swapped: Boolean
    for (i in 0 until n - 1) {
        swapped = false
        for (j in 0 until n - i - 1) {
            if (arr[j] > arr[j + 1]) {
                val temp = arr[j]
                arr[j] = arr[j + 1]
                arr[j + 1] = temp
                swapped = true
            }
        }
        // 스와핑이 이루어지지 않았다면 반복 종료
        if (!swapped) {
            break
        }
    }
    return arr
}
    

최적화된 버전의 실행 예시


fun main() {
    val array = intArrayOf(64, 34, 25, 12, 22, 11, 90, 1, 2, 3, 4, 5)
    println("정렬 전 배열: ${array.joinToString(", ")}")
    val sortedArray = optimizedBubbleSort(array)
    println("정렬 후 배열: ${sortedArray.joinToString(", ")}")
}
    

위의 코드를 실행하면 다음과 같은 결과를 확인할 수 있습니다.


정렬 전 배열: 64, 34, 25, 12, 22, 11, 90, 1, 2, 3, 4, 5
정렬 후 배열: 1, 2, 3, 4, 5, 11, 12, 22, 25, 34, 64, 90
    

버블 정렬의 활용

버블 정렬은 간단한 정렬 알고리즘으로, 대체로 학습 목적이나 알고리즘 입문용으로 적합합니다. 하지만 대량의 데이터나 효율성이 중요한 상황에서는 퀵 정렬, 머지 정렬 등의 더 효율적인 알고리즘이 필요합니다.

마치며

이번 포스팅에서는 버블 정렬의 개념, 구현 방법, 최적화 기법에 대해 알아보았습니다. 알고리즘을 배우고 구현하는 과정에서 다양한 접근 방식을 시도해 보는 것은 매우 중요합니다. 다음 시간에는 다른 정렬 알고리즘에 대해 다루어보도록 하겠습니다.

감사합니다!

코틀린 코딩테스트 강좌, 버블 소트 프로그램 2

안녕하세요! 이번 강좌에서는 코틀린 언어를 사용하여 버블 소트(Bubble Sort) 알고리즘을 구현하는 방법에 대해 알아보겠습니다. 버블 소트는 정렬 알고리즘 중에서 가장 기초적인 알고리즘 중 하나이며, 이해하기 쉽기 때문에 코딩 테스트의 기초 문제로 자주 출제됩니다. 우리는 자세한 설명과 함께 문제를 풀어볼 것입니다.

문제 정의

주어진 정수 배열을 오름차순으로 정렬하는 프로그램을 작성하시오. 배열의 길이는 N (1 ≤ N ≤ 1000)이며, 각 원소는 M (-104 ≤ M ≤ 104)입니다.

예제

  • 입력: [64, 34, 25, 12, 22, 11, 90]
  • 출력: [11, 12, 22, 25, 34, 64, 90]

알고리즘 설명

버블 소트는 인접한 두 원소를 비교하여 순서가 잘못된 경우 서로 교환하는 방식으로 정렬하는 알고리즘입니다. 이 과정이 반복되면서 가장 큰 값이 배열의 제일 끝으로 이동하게 되므로 “버블”이라는 이름이 붙었습니다. 버블 소트의 평균 및 최악의 시간복잡도는 O(N2)입니다.

버블 소트 알고리즘

  1. 배열의 크기 N을 가져옵니다.
  2. 0부터 N-1까지 반복합니다.
  3. 배열의 첫 번째 인덱스부터 N-i-1까지 반복하며, 두 인덱스에 있는 값을 비교합니다.
  4. 만약 첫 번째 인덱스의 값이 두 번째 인덱스의 값보다 크면 두 값을 서로 교환합니다.
  5. 모든 반복이 끝난 후 배열은 정렬되어 있게 됩니다.

코틀린 구현

이제 알고리즘을 실제로 코틀린으로 구현해보겠습니다:


fun bubbleSort(arr: IntArray): IntArray {
    val n = arr.size
    for (i in 0 until n - 1) { 
        // 마지막 i개는 이미 정렬되었으므로, n-i-1까지 반복합니다.
        for (j in 0 until n - i - 1) {
            // 인접한 두 원소 비교
            if (arr[j] > arr[j + 1]) {
                // 교환
                val temp = arr[j]
                arr[j] = arr[j + 1]
                arr[j + 1] = temp
            }
        }
    }
    return arr
}

fun main() {
    val inputArray = intArrayOf(64, 34, 25, 12, 22, 11, 90)
    val sortedArray = bubbleSort(inputArray)
    println("정렬된 배열: ${sortedArray.joinToString(", ")}")
}
    

설명

위의 코드는 기본적인 버블 소트 구현을 보여줍니다. 주요 함수 bubbleSort는 정수 배열을 입력받아 정렬된 배열을 반환합니다. 두 개의 중첩 루프를 사용하여 인접한 원소를 비교하고, 필요할 경우 교환하는 방식으로 동작합니다.

코드 동작 과정

코드를 실행하면 다음과 같은 결과를 출력합니다:

정렬된 배열: 11, 12, 22, 25, 34, 64, 90

복잡도 분석

버블 소트의 시간 복잡도는 O(N2)입니다. 이는 최악의 경우, 모든 원소를 비교해야 하기 때문입니다. 그러나 최적의 경우(이미 정렬된 배열)는 시간 복잡도가 O(N)으로 줄어듭니다. 공간 복잡도는 O(1)입니다.

버블 소트의 장단점

버블 소트의 장단점은 다음과 같습니다:

  • 장점:
    • 구현이 간단하다.
    • 최소한의 메모리를 소모한다.
    • 정렬을 수행하는 과정에서 배열이 이미 정렬되어 있는지를 검사할 수 있다.
  • 단점:
    • 시간 복잡도가 너무 높아 큰 데이터셋에서는 비효율적이다.
    • 다른 효율적인 정렬 알고리즘과 비교했을 때 성능이 떨어진다.

응용 문제

이제 위의 개념을 바탕으로 조금 더 응용된 문제를 해결해보겠습니다. 주어진 배열에서 중복된 원소를 제거하고 정렬하여 출력하세요.

문제 정의

정수 배열을 입력받아 중복된 원소를 제거하고 오름차순으로 정렬한 결과를 출력하는 프로그램을 작성하시오.

예제

  • 입력: [64, 34, 25, 25, 12, 22, 11, 90, 90]
  • 출력: [11, 12, 22, 25, 34, 64, 90]

코드 구현


fun removeDuplicatesAndSort(arr: IntArray): IntArray {
    return arr.distinct().toIntArray().let { bubbleSort(it) }
}

fun main() {
    val inputArray = intArrayOf(64, 34, 25, 25, 12, 22, 11, 90, 90)
    val resultArray = removeDuplicatesAndSort(inputArray)
    println("중복 제거 및 정렬된 배열: ${resultArray.joinToString(", ")}")
}
    

결과

위의 코드를 실행하면 다음과 같은 결과가 출력됩니다:

중복 제거 및 정렬된 배열: 11, 12, 22, 25, 34, 64, 90

마무리

이번 강좌에서는 버블 소트 알고리즘에 대해 자세히 알아보았고, 이를 통해 기본적인 정렬 문제와 중복 제거 문제를 해결했습니다. 비록 버블 소트는 간단하고 이해하기 쉬운 알고리즘이지만, 코딩 테스트에 나오는 다양한 정렬 알고리즘을 익히고 연습하면 더욱 효과적으로 문제를 해결할 수 있습니다. 다음 강좌에서는 더 효율적인 정렬 알고리즘에 대해 다루는 시간을 갖겠습니다. 감사합니다!