2007년 1월 7일 일요일

Theme from Enter the Dragon

광고나 시트콤 등의 삽입곡으로 심심찮게 사용되는 바로 그 곡입니다. 이 곡의 제목만 보고 모르시는 분들도 들어보시면 '아!' 하실...

이 곡은 '이소룡(Bruce Lee)'이 출연한 영화 '용쟁호투(Enter The Dragon)'에 메인 타이틀로 삽입된 'Theme from Enter the Dragon'이란 곡입니다. Google 신의 도움으로 어렵지 않게 찾을 수 있었네요. 듣고 있으면 투쟁에 대한 본능이 꿈틀거리면서 웬지 모를 에너지가 솟구치는 느낌이 들지 않습니까? ㅡㅡ^

Theme from Enter the Dragon
[이 곡의 출처는 http://palmsout.blogspot.com 입니다.]


위 링크는 너무 오래 돼서 더 이상 파일이 제공되지 않네요.
YouTube 검색해서 찾은 걸로 대신합니다.



다른 얘기입니다만, 흔히 어떤 일에서 보통의 사람들이 쉽게 접근할 수 없는 일정 수준 혹은 그 이상에 오른 상태를 '경지'라는 단어로 압축 표현하곤 합니다. 저는 '이소룡(Bruce Lee)'이란 인물에 대해 자세히 알지 못합니다만 인터넷이나 미디어 등을 통해서 그가 무술의 한 경지를 이룩했다는 정도는 알고 있습니다. 제가 하는 일과는 거의 아무런 관계도 없지만 그에 대한 경외감이 드는 것은 참 알 수 없는 노릇입니다.

Common Lisp 공부 - 넥슨 입사 문제 1 번 풀이

요즘 공부 좀 해보려고 이것 저것 찔러보고 있는 중입니다. 아무 것도 하지 않고 계속 시간만 보내다가는 정말 머리가 굳어버릴 것만 같은 위기감을 느꼈기 때문이죠. 새해도 되고 했으니 설사 '작심삼일(作心三日)'이 될지언정 시도조차 하지 않아서야 사람이라고 하겠습니까.. 쩝..

아무튼, 찔러보는 것 중에서 Common Lisp이 있는데, 애자일 이야기에서 우연히 접하게 된 넥슨 입사 문제 중 1 번을 시험 삼아 구현해보았습니다. 공부를 막 시작한지라 구현 내용이 다소 비효율적이고 어눌할 수도 있으니 너그러이 이해해주세요. ;-)

문제 내용은 다음과 같습니다.
어떤 자연수 n이 있을 때, d(n)을 n의 각 자릿수 숫자들과 n 자신을 더한 숫자라고 정의하자. 예를 들어 d(91) = 9 + 1 + 91 = 101 이다. 이 때, n을 d(n)의 제네레이터(generator)라고 한다. 위의 예에서 91은 101의 제네레이터이다. 어떤 숫자들은 하나 이상의 제네레이터를 가지고 있는데, 101의 제네레이터는 91 뿐 아니라 100도 있다. 그런데 반대로, 제네레이터가 없는 숫자들도 있으며, 이런 숫자를 인도의 수학자 Kaprekar가 셀프 넘버(self-number)라 이름 붙였다. 예를 들어 1,3,5,7,9,20,31 은 셀프 넘버 들이다.

1 이상이고 5000 보다 작은 모든 셀프 넘버들의 합을 구하라.

풀이 내용은 다음과 같습니다.
;; 주어진 수의 각 자리수의 합을 구한다.
;; (예, 352 -> 3 + 5 + 2)
(defun sum-of-each-digit (x)
(if (< x 10)
x
(+ (mod x 10)
(sum-of-each-digit (truncate (/ x 10))))))

;; 주어진 수의 generated number를 구한다.
(defun get-generated-number (x)
(+ x (sum-of-each-digit x)))

;; 주어진 범위 내에 존재하는 generated number의 list를 구한다.
;; 범위: (x <= r < y)
(defun get-generated-number-list (x y)
(do ((i x (1+ i))
(gnum (get-generated-number x)
(get-generated-number i))
(gnums ()))
((or (>= gnum y) (>= i y))
(remove-duplicates (sort gnums #'<)))
(push gnum gnums)))

;; 주어진 범위 내의 정수 list를 구한다.
;; 범위: (x <= r < y)
(defun make-number-range-list (x y)
(do ((i x (1+ i))
(rnums ()))
((>= i y) (reverse rnums))
(push i rnums)))

;; 주어진 범위 내에 존재하는 Self Number의 list를 구한다.
;; 범위: (x <= r < y)
(defun get-self-number-list (x y)
(set-difference
(make-number-range-list x y)
(get-generated-number-list x y)))

;; 주어진 범위 내에 존재하는 Self Number의 합을 구한다.
;; 범위: (x <= r < y)
(defun sum-of-self-number-list (x y)
(apply #'+ (get-self-number-list x y)))

;; 1부터 5000 사이에 존재하는 Self Number들의 합을 구한다.
(sum-of-self-number-list 1 5000)

결과: 1227365