폰 자판기를 누르면 알파벳을 입력할 수 있다. 알파벳은 2번부터 9번 자판에 존재한다. 각각의 자판은 순서대로 a부터 3개의 알파벳을 가지고 있으며 7, 9번만 4개를 가진다. 최대 4의 길이를 가진 자판이 주어질 때(2 ~ 9까지의 숫자가 문자열로 이어짐) 순서대로 가능한 알파벳 목록을 반환하면 된다. 이때 자판을 누르면 랜덤한 알파벳이 나온다고 가정한다. 예를 들어 "23"이 주어지면 ["ad","ae","af","bd","be","bf","cd","ce","cf"]가 가능하다.
최대 4의 길이만 주어지고 자판의 개수도 8개이기 때문에 단순 반복문으로 해결이 가능하다. 자판을 누르는 순서대로 기존에 있는 경우의 수에 현재 자판의 알파벳들을 하나씩 더하면 된다.
class Solution(
private val buttons: Map<Char, List<String>> = mapOf(
'2' to listOf("a", "b", "c"),
'3' to listOf("d", "e", "f"),
'4' to listOf("g", "h", "i"),
'5' to listOf("j", "k", "l"),
'6' to listOf("m", "n", "o"),
'7' to listOf("p", "q", "r", "s"),
'8' to listOf("t", "u", "v"),
'9' to listOf("w", "x", "y", "z")
)
) {
fun letterCombinations(digits: String): List<String> =
digits.fold(listOf()) { list, digit ->
if (list.isEmpty()) buttons[digit]!!
else mutableListOf<String>().apply {
for (alphabet in buttons[digit]!!)
for (case in list) add(case + alphabet)
}
}
}