2007년 8월 19일 일요일

Erlang 공부 - 넥슨 입사 시험 문제 1 번 풀이

지난 번에 Common Lisp으로 풀어 본 넥슨 입사 시험 문제 1 번에 대해서 이번에는 Erlang으로 다시 한번 시도해봤습니다.

상세한 문제 내용은 이전 글을 참고해주시고, 간단히 요약을 하면 다음과 같습니다.
1부터 5000 사이의 Self Number들의 합을 구하시오.

풀이 내용은 다음과 같습니다.
-module(selfnum).
-export([sum_of_digits/1,
generate/1,
get_self_numbers/2,
get_sum_of_self_numbers/2]).

sum_of_digits(N) ->
Digits = integer_to_list(N),
sum_of_digits1(Digits).

sum_of_digits1(Digits) ->
Nums = lists:map(fun(D) ->
D - $0 end,
Digits),
lists:sum(Nums).

generate(N) when N > 0 ->
N + sum_of_digits(N).

get_self_numbers(M, N) when M =< N ->
Range_Nums = lists:seq(M, N),
Gen_Nums = lists:map(fun generate/1, Range_Nums),
lists:subtract(Range_Nums, Gen_Nums).

get_sum_of_self_numbers(M, N) when M =< N ->
Self_Nums = get_self_numbers(M, N),
lists:sum(Self_Nums).

sum_of_digits 메서드(method)를 다르게 구현해봤습니다.
-module(selfnum).
-export([sum_of_digits/1,
generate/1,
get_self_numbers/2,
get_sum_of_self_numbers/2]).

sum_of_digits(N) ->
Digits = integer_to_list(N),
sum_of_digits(Digits, 0).

%%---------------------------------------
%% Tail-recursion 방식으로 구현
sum_of_digits([D|Rest], Acc) ->
I = D - $0,
sum_of_digits(Rest, Acc + I);
sum_of_digits([], Acc) ->
Acc.
%%---------------------------------------

generate(N) when N > 0 ->
N + sum_of_digits(N).

get_self_numbers(M, N) when M =< N ->
Range_Nums = lists:seq(M, N),
Gen_Nums = lists:map(fun generate/1, Range_Nums),
lists:subtract(Range_Nums, Gen_Nums).

get_sum_of_self_numbers(M, N) when M =< N ->
Self_Nums = get_self_numbers(M, N),
lists:sum(Self_Nums).

compile하고 각 메서드에 대해 실행한 결과는 다음과 같습니다.


[그림 1] 실행 결과

Erlang도 예전부터 관심은 있었는데, 계속 공부를 미루다 최근에 와서야 마음 먹고 집중해보고 있습니다. 오랫동안 C/C++, Java 관련 일만 해와서인지 패러다임이 다른 프로그래밍 언어에 익숙해지는 것이 쉽지 않습니다. 하지만, 재미있습니다. 모르고 있던 새로운 것을 알게 된다는 것은 그 자체만으로도 충분히 기쁨입니다. :)

댓글 5개:

  1. 잘 보고 계시다는 말씀 한 마디에 마구 힘이 납니다. 감사합니다. ^^ 행복한 하루 되세요~

    답글삭제
  2. kaisyu님 안녕하세요.. 저는 컴터쪽이아니라 잘모르겠지만 항상 언어쪽으로는 관심은 많은편인데.. Erlang 이라는 언어가 자바나 C보다 좀 더 편한가요? 가령 지원하는 함수나 문장쓰는 자유도가 높다던지?
    아님 C나 자바가 못하는 어떤걸 한다던지?
    ^^

    답글삭제
  3. 안녕하세요. wise view님...

    저도 공부를 시작한지 얼마 되지 않아서 자신있게 '이런 점이 좋다!'라고 말씀을 드리기가 어렵습니다. ^^;

    그냥 주워 들은 이야기 몇 가지를 풀어보면 Erlang의 큰 특징이 두 가지가 있습니다.

    첫째는 함수형 프로그래밍 언어라는 것이고, 둘째는 Concurrent Programming을 위한 기본적인 설계가 언어에 포함되어 있다는 것입니다.

    Erlang이 Functional Programming Language(함수형 프로그래밍 언어)라는 점에 대비해서 C, C++, Java 등의 언어를 Imperative Programming Language(절차형 프로그래밍 언어)라고 부릅니다. 대체적으로 함수형 언어는 절차형 언어에 비해 표현력이 좀더 풍부하다고 알려져 있고, 지금까지의 제 짧은 경험이 비추어봤을 때도 Erlang이 C, C++, Java에 비해 표현력이 풍부하다는 느낌입니다.

    그리고, Concurrent Programming의 특징이 언어 설계에 포함되어 있기 때문에 분산 처리 구현에 매우 용이하다고 합니다. 실제로, IPC에서부터 RPC, Sokcet 등 간편하게 구현할 수 있습니다. 또한 안정성 측면에서 강도 높은 테스트를 거친 결과들이 제법 있습니다.

    Erlang에 대한 자료는 http://www.erlang.org 에서 많이 접하실 수 있습니다. 관심 있으시면 한번 들러보세요.

    좋은 하루 되세요. ^^

    답글삭제