Kotlin 확장 함수를 활용한 코딩 테스트

한포도·2024년 12월 23일
0

Coding Test

목록 보기
2/2
post-thumbnail

코틀린은 기존 클래스에 새로운 기능을 추가할 수 있는 확장 함수(Extension Function)라는 강력한 기능을 제공합니다. 오늘은 실제 코딩 테스트 문제를 통해 확장 함수를 어떻게 효과적으로 활용할 수 있는지 알아보겠습니다.

문제 개요

이번 문제는 프로그래머스 Lv2 메뉴 리뉴얼입니다.
손님들의 주문 기록을 분석하여 가장 많이 함께 주문된 메뉴들의 조합을 찾아내야 합니다.

코딩 테스트에서 확장 함수를 사용해야 하는 이유

1. 빠른 구현 속도

private fun List<Char>.combinations(length: Int): List<List<Char>> =
    if (length == 1) map { listOf(it) }
    else dropLast(length - 1).mapIndexed { index, char ->
        drop(index + 1).combinations(length - 1).map { listOf(char) + it }
    }.flatten()
  • 템플릿화된 유틸리티 함수
    • 자주 사용되는 알고리즘은 확장 함수로 미리 준비해두면 시험 시간을 절약할 수 있습니다.
    • combinations, permutations 같은 기본 알고리즘을 확장 함수로 구현해두면 재사용이 용이합니다.

2. 디버깅 용이성

fun solution(orders: Array<String>, course: IntArray) = course
    .flatMap { size ->
        orders.flatMap { order ->
            order.toList().sorted().combinations(size)  // 확장 함수 호출
                .map { it.joinToString("") }
        }
        .groupingBy { it }
        .eachCount()
        .filter { it.value > 1 }
        .entries
        .groupBy { it.value }
        .maxByOrNull { it.key }
        ?.value
        ?.map { it.key }
        ?: emptyList()
    }
    .sorted()
    .toTypedArray()
  • 로직 분리로 인한 디버깅 편의성
    • 확장 함수로 분리된 로직은 독립적으로 테스트가 가능합니다.
    • 문제가 발생했을 때 확장 함수만 따로 검증할 수 있어 디버깅 시간이 단축됩니다.

3. 시간 복잡도 최적화

  • 체이닝을 통한 효율적인 처리
    • 중간 컬렉션 생성을 최소화할 수 있습니다.
    • 함수형 체이닝을 통해 메모리 사용을 최적화할 수 있습니다.

코딩 테스트에서 자주 사용되는 확장 함수 예시

1. 문자열 처리

fun String.isPalindrome(): Boolean = 
    this == this.reversed()

fun String.countChar(char: Char): Int = 
    count { it == char }

2. 컬렉션 처리

fun List<Int>.findTwoSum(target: Int): Pair<Int, Int>? {
    val seen = mutableMapOf<Int, Int>()
    this.forEachIndexed { index, num ->
        seen[target - num]?.let { return it to index }
        seen[num] = index
    }
    return null
}

3. 그래프/트리 탐색

fun List<List<Int>>.bfs(start: Int): List<Int> {
    val visited = mutableSetOf<Int>()
    val queue = ArrayDeque<Int>().apply { add(start) }
    val result = mutableListOf<Int>()
    
    while (queue.isNotEmpty()) {
        val current = queue.removeFirst()
        if (current in visited) continue
        
        visited.add(current)
        result.add(current)
        queue.addAll(this[current].filter { it !in visited })
    }
    return result
}

결론

코딩 테스트에서 Kotlin의 확장 함수를 적절히 활용하면, 코드의 가독성과 재사용성을 높이면서도 개발 시간을 단축할 수 있습니다. 특히 자주 사용되는 알고리즘이나 유틸리티 함수들을 확장 함수로 미리 준비해두면, 실제 시험에서 큰 도움이 될 수 있습니다

profile
응애 개발맨

0개의 댓글