인터넷에서 우연히 넥슨의 입사 문제를 접하게 되었습니다.

1번 문제를 J라는 언어로 풀어보았습니다(문제에는 C나 C++로 풀라고 명시되어 있습니다만). 제가 푼 것은 훨씬 직접적인데, 여러분들의 이해를 위해 쉽게 풀어 써봤습니다.


digits=:10&#.^:_1
digits 123
1 2 3

add=:+
over=:/
sum=:add over
of=:@

generate=: add sum of digits
generate 123
129

foreach=:"0
geneach=:generate foreach
geneach 123 456
129 471

except=:-.
selfnum=: except geneach
lessthan=:>:@i.@<:
lessthan 10
1 2 3 4 5 6 7 8 9
sum of selfnum lessthan 5000
1227365


제가 실제로 이 문제를 푼 과정은 대략 다음과 같습니다.


d=:(10&#.)^:_1
g=:(+ +/@d)"0
+/ (-. g) >:i.<:5000
1227365


문제를 푸는 데 걸린 시간은 30초, 실행시간은 구닥다리 제 컴퓨터에서 0.2초. 효율성은 고려를 안했습니다. 더 나은 풀이가 있으리라 생각합니다만 일단 만족할만한 수준으로 결과가 나와줘서 그냥 제 "문제 데이타베이스"에 넣어버렸습니다.

문제를 풀고 검색해 보니, 함수형 언어 블로그를 운영하시는 귤님께서 헤스켈(Haskell)로 푼 가 있더군요. 아마 첫번째 풀이는 헤스켈의 수학적인 아름다움을 보여주기 위해 수행시간을 무시하고 만드신 것 같습니다. 제 컴퓨터에서 실행했다가 10분을 기다려도 끝나지 않아서 ctrl-c 해버렸습니다. --; 좀 더 빠른 실행을 위한 getGenerator 함수를 사용하면 10초 정도로 시간이 상당히 줄어드네요.

--김창준