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초 정도로 시간이 상당히 줄어드네요.
--김창준