코틀린은 기존 클래스에 새로운 기능을 추가할 수 있는 확장 함수(Extension Function)라는 강력한 기능을 제공합니다. 오늘은 실제 코딩 테스트 문제를 통해 확장 함수를 어떻게 효과적으로 활용할 수 있는지 알아보겠습니다.
이번 문제는 프로그래머스 Lv2 메뉴 리뉴얼입니다.
손님들의 주문 기록을 분석하여 가장 많이 함께 주문된 메뉴들의 조합을 찾아내야 합니다.
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()
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()
fun String.isPalindrome(): Boolean =
this == this.reversed()
fun String.countChar(char: Char): Int =
count { it == char }
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
}
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의 확장 함수를 적절히 활용하면, 코드의 가독성과 재사용성을 높이면서도 개발 시간을 단축할 수 있습니다. 특히 자주 사용되는 알고리즘이나 유틸리티 함수들을 확장 함수로 미리 준비해두면, 실제 시험에서 큰 도움이 될 수 있습니다