문제는 인사이트의 블로그에서 확인할 수 있듯이,
팩토리얼(!)의 결과값에서, 마지막에 연속되는 0의 개수와 0이 아닌 첫번째 숫자를 알아내는 것이다.
사실, 이전 문제를 낑낑대며 풀고, 다른 사람들의 풀이 법을 보니, 완전 삽질했구나 싶었다. 더구나 이미 얼랭을 사용한 사람이 있다니…OTL
그러나 이건 좀 쉽다! 한 15분 걸린 것 같다. Erlang도 조금 익숙해 졌고…
1. 팩토리얼식의 각 값을 순차적으로 곱한다. last/1
1.1 1의 과정 중, 마지막 0의 수를 세어 누적한다. countzero/1
1.2 1의 과정 중, 0이 아닌 마지막 수를 다음 곱셈에 사용하고, 나머지 숫자는 버린다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
-module(insight2). -export([last/1]). countzero(0, _) -> invalid_value; countzero(N, Num) -> case N rem 10 of 0 -> countzero(N div 10, Num + 1); _ -> {N rem 10, Num} end. % return tuple {LastValue, ZeroCount} or invalid_value countzero(N) -> countzero(N, 0). last(0, Val, ZeroNum) -> {ZeroNum, Val}; last(N, Val, ZeroNum) -> case countzero(N * Val) of {First, ZeroCount} -> last(N - 1, First, ZeroNum + ZeroCount); invalid_value -> error end. % return tuple {ZeroCount, LastValue} last(N) -> last(N, 1, 0). |
출력예
Eshell V5.9.1 (abort with ^G) 1> c(insight2). {ok,insight2} 2> insight2:last(1). {0,1} 3> insight2:last(10). {2,8} 4> insight2:last(100). {24,6} 5> insight2:last(2012). {490,2} 6> insight2:last(10000). {2444,2} 7>