Outsider's Dev Story

Stay Hungry. Stay Foolish. Don't Be Satisfied.
RetroTech 팟캐스트 44BITS 팟캐스트

Scala로 풀어본 Commify

요즘 계속 프로그래밍 퀴즈를 해보고 있는데 이번에는 Commify입니다.
Commify는 숫자에 원하는 자릿수에 콤파를 찍어주는 것을 얘기합니다. 123456에 3을 넘겨주면 123,456을 돌려주는 것입니다.


def numberFormat(src:Int, cnt:Int):List[String] = {
   val tempString = src.toString.reverse
   val regex = ("""\d{""" + cnt + "}").r
   val segment = regex findFirstIn tempString
   
   segment match {
      case None => List(tempString)
      case str if tempString.length <= cnt => List(tempString)
      case _ => segment.toList ::: numberFormat(tempString.substring(cnt).reverse.toInt, cnt)
   }
}

def convert(src:Int, cnt:Int):String = {
   numberFormat(src, cnt).mkString(",").reverse
}

println( convert(12345, 3) ) // 12,345
println( convert(123456789, 2) ) // 1,23,45,67,89
println( convert(123345678, 3) ) // 123,345,678

설명만 들었을 때는 간단할것 같았지만 막상 하려니 고민을 많이 하게 되었고 생각만큼 쉽지 않았습니다. Functional 스타일로 재귀적으로 풀어보려고 했더니 더 많은 고민을 했던것 같습니다. numberFormat 함수에서 전달된 숫자를 정규식으로 자릿수만큼 잘라낸 뒤에 패턴매칭을 이용해서 자릿수만큼 잘라내서 List로 만들고 나머지 부분은 다시 재귀호출을 하도록 했습니다. 뒤에부터 잘라내려다 보니 reverse를 썼는데 재귀호출을 위해서 다시 reverse를 하는 것이 그다지 이쁘진 않군요. ㅡㅡ;; convert함수에서 돌려받은 List를 mkString을 이용해서 콤마(,)로 연결해서 돌려주게 됩니다.

아마 프로그래밍 퀴즈 풀이는 일단 이 글이 마지막이 될듯 합니다. Scala의 문법에도 익숙하지 않은데도 알고리즘에 대해서 같이 고민하는 것이 만만치 않았는데 시간은 많이 소비되기는 했지만 문제풀이에 대해서 고민해 보는 것은 꽤 재밌는 시간이었던 것 같습니다. 프로그래밍을 포함해서 문제영역에 접근하는 법이나 그에 대한 풀이에 대한 여러가지 고민들등 지속적으로 하면 정말 많은 도움이 될 것 같습니다. 여유없다는 핑계로 좀더 고민해보고 리팩토링까지 해보지 못한게 약간 아쉽습니다.
2010/09/13 00:34 2010/09/13 00:34