자연수 n을 입력받고, n!의 계산 결과 중 마지막에 붙은 연속된 0의 개수와 연속된 0 바로 앞에 나오는 숫자를 구하라.

[실행 예]

input n: 15
output: 3 8

[설명]

15!은 1307674368000이므로, 마지막에 연속된 0은 3개이고, 바로 앞의 숫자는 8이다.

* 조건 *

  1. n의 범위는 1 이상, 10000 이하입니다.
  2. 테스트 입력은 다음과 같습니다.
    20! = 2432902008176640000
    30! = 265252859812191058636308480000000
    40! = 815915283247897734345611269596115894272000000000
    50! = 30414093201713378043612608166064768844377641568960512000000000000
    100! = 93326215443944152681699238856266700490715968264381621468592963
    8952175999932299156089414639761565182862536979208272237582511852
    10916864000000000000000000000000
  3. 프로그래밍 언어에서 제공하는 자릿수 제한 없는 곱셈을 이용하거나, 이런 형태의 곱셈 함수를 직접 구현해도 답을 얻을 수 있지만, 문제의 의도와는 다릅니다.
  4.  정답 검토의 편의를 위해 블로그 포스팅에 2012!와 10000!의 결과를 남겨주세요.
  5. (심화 문제) 연속된 0 앞에 나오는 여러 숫자를 구하는 것도 가능하니, 심심하신 분은 도전해보세요. ^^


먼저 정답

(calc-fact 2012)=> [501 8] (calc-fact 10000) => [2499 8]


풀이 및 코드

곱셈의 경우 상위 자리 수가 하위 자리로 내려오는 일은 없다. 고로 하위 자리만 기억하고 있으면 된다.

팩토리얼은 과거의 누적 값 * 현재 값 이다. 이때 오버플로우가 나지 않도록 누적 값에 바운더리를 적절하게 조절해 준다.

;; clojure 

(defmacro find-bound [n] `(apply * (repeat (count (str ~n)) 10)))

(defn but-last-zero [_n] (loop [n _n, zero-cnt 0] (cond (zero? (mod n 10)) (recur (int (/ n 10)) (inc zero-cnt)) :else [n, zero-cnt]))) (defn calc-fact [n] (let [[zero-cnt last-num & _] (reduce (fn [acc i] (let [[prev-zero-cnt, prev-num & _] acc, [cur-num, cur-zero-cnt & _] (but-last-zero (* prev-num i)) bound (find-bound i)] [(+ prev-zero-cnt cur-zero-cnt ), (mod cur-num bound)] )) [0 1] (range 2 (inc n)))] [zero-cnt, (mod last-num 10)]))



      카테고리 없음  |  2012. 9. 7. 00:59
2013.07.21 10:32 댓글에 댓글수정/삭제
귀를 기울여봐 가슴이 뛰는 소리가 들리면 네가 사랑하는 그 사람 널 사랑하고 있는거야.
.
ghd
2013.07.21 12:25 댓글에 댓글수정/삭제
희미한 달빛이 샘물 위에 떠있으면,나는 너를 생각한다.
.
2013.07.21 13:09 댓글에 댓글수정/삭제
좋으면 좋고 싫으면 싫은 거지, 뭐가 이렇게 어렵고 복잡하냐구
.
GHd
2013.07.24 04:22 댓글에 댓글수정/삭제
태양이 바다에 미광을 비추면,나는 너를 생각한다.
.
2013.07.25 03:33 댓글에 댓글수정/삭제
지금은 반짝반짝 빛이 나겠지,, 하지만 시간이 흐르면 그빛은 사라저버릴거야,지금 우리처럼
.
name ::   password :: blog :: secret
등록





http://www.insightbook.co.kr/post/3855

자연수 n을 입력받아 집합 {0, 1, 2, …, n-1}을 하나 이상의 집합으로 나누는 방법을 모두 출력하는 프로그램을 작성하세요.

[실행 예]

input n: 3
{0, 1, 2}
{0} {1, 2}
{1} {0, 2}
{2} {0, 1}
{0} {1} {2}

 * 참고 *

1. n의 범위는 크게 상관이 없지만, 대략 16 이하라고 가정하시면 되겠습니다. ^^
2. 집합으로 나눈 경우를 출력하는 방법은 상관없습니다.

- {1} {0, 2}를 {0, 2} {1}로 표현해도 되고, 1, 0 2로 표현해도 됩니다. (다른 형식도)
- 또, {0} {1, 2}가 먼저 출력되든, {0} {1} {2}가 먼저 출력되든 상관 없습니다. 빠짐없이 출력하기만 하면 됩니다.ds


구현 입니다.

n이 2인 경우에 기저 조건을 채우고, 2 이상의 n에 대해서 에 대해서 n-1을 재귀적으로 더해가는 과정을 반복합니다.

아직 clojure에 익숙하지 않아서 불필요한 코드가 많이 생겼네요. 

flat 이나 rotates같은 보조함수가 없어도 쉽게 구현이 될것 같은데 조금 더 연구가 필요할듯.


;; clojure

(defn rotates [xss] (for [idx (range (count xss))] (let [[a b & _] (split-at idx xss)] (concat b a)))) (defn flat [xss] (loop [[x & xs :as xss] xss, acc []] (cond (empty? xss) acc (= (count x) 1) (recur xs (conj acc (first x))) :else (recur xs (concat x acc))))) (defn find-sub-set [[x & xs :as xss]] (cond (= (count xss) 2) (let [[a b & _] xss] `(((~a), (~b)), ((~a, ~b)))) :else (let [subs (find-sub-set xs)] (concat (map #(cons `(~x) %) subs) (flat (map #(map (fn [[h & r]] (cons (cons x h) r)) (rotates %)) subs))))))

출력

=> 

((0) (1) (2) (3)) ((0) (1) (2 3)) ((0) (1 2) (3)) ((0) (1 3) (2)) ((0) (1 2 3)) ((0 1) (2) (3)) ((0 2) (3) (1)) ((0 3) (1) (2)) ((0 1) (2 3)) ((0 2 3) (1)) ((0 1 2) (3)) ((0 3) (1 2)) ((0 1 3) (2)) ((0 2) (1 3)) ((0 1 2 3))


      카테고리 없음  |  2012. 9. 3. 18:52
2013.07.28 21:55 댓글에 댓글수정/삭제
다른 남자 부르면서 울거면 나한테 이쁘지나 말던지
.
name ::   password :: blog :: secret
등록




http://www.insightbook.co.kr/post/3814

배열 arr[]과 위치 s, t가 있을 때,
arr[s], arr[s+1], … , arr[t-1]을 오른쪽으로 한 칸씩 이동하고,
arr[t]는 arr[s]로 복사하는 것을 ’1만큼 오른쪽으로 회전시켰다’고 한다.

예를 들어 길이가 8인 배열에서 s=2, t=6이면 다음 그림처럼 바뀐다.

길이가 n인 배열의 위치는 0, 1, 2, … , n-1이다.

문제 : k를 인자로 받아서 k만큼 오른쪽으로 회전시키는 함수를 작성하라.
단, 1만큼 오른쪽으로 이동시키는 과정을 k번 반복해서는 안 된다.


풀이 1: [1,2] + [7] + [4,5,6] + [8]

var slice_rotate_h = function(ls, s, e, k){
  var left = ls.slice(0, s), middle = ls.slice(s, e+1), right = ls.slice(e+1);
  var l = middle.slice(middle.length - k), r = middle.slice(0, middle.length - k);

  return left.concat(l.concat(r)).concat(right);
};

풀이 2: O(N) 버전 -> 회전하는 부분의 index를 보고 다른 array로 복사

var slice_rotate_on = function(ls, s, e, k){ for (var i=0, r=[], len=ls.length; i<len; i++){ var item = ls[i], shifted = i - k; if ( i < s ) r[i] = item; else if ( i > e ) r[i] = item; else r[i] = shifted < s ? ls[shifted + e-s + 1] : ls[shifted]; } return r; };

테스트

function equal(c,a,b) { console.log(c == (!!a && !!b && !(a<b || b<a))); }; var arr = [1, 2, 3, 4, 5, 6, 7, 8];


equal(true, slice_rotate_h(arr, 2, 6, 1), [1, 2, 7, 3, 4, 5, 6, 8]);

equal(false, slice_rotate_h(arr, 2, 6, 1), [1, 2, 3, 4, 5, 6, 7, 8]);


equal(true, slice_rotate_on(arr, 2, 6, 1), [1, 2, 7, 3, 4, 5, 6, 8]);

equal(false, slice_rotate_on(arr, 2, 6, 1), [1, 2, 3, 4, 5, 6, 7, 8 ]);


      카테고리 없음  |  2012. 8. 30. 21:39
ugg
2013.07.28 21:18 댓글에 댓글수정/삭제
슬퍼서 우는거 아니야..바람이 불어서 그래..눈이 셔서..
.
name ::   password :: blog :: secret
등록











"저는 제 자신에게 늘 이렇게 묻곤 했습니다. 

'만약 오늘이 내 생애 마지막 날이라면, 나는 과연 오늘 하려는 일을 하고 싶어 할까?' 

그리고 너무 여러 날 동안 계속해서 아니오라는 대답이 나오면, 그때는 뭔가 달라져야할 필요가 있음을 깨닫곤 했습니다. 

제가 곧 죽을 거란 사실을 기억하는 것은 제 인생에서 커다란 선택을 내리는 데 도움을 주는 가장 중요한 것입니다. 
왜냐하면 타인의 기대, 자부심, 좌절, 실패 등 세상의 모든 것들은 죽음 앞에서 덧없이 사라지고,

오직 진정으로 중요한 것만 남기 때문입니다. 

저는 암 진단을 받았습니다. 죽음은 어느 누구도 피하지 못합니다.
그리고 그래야만 합니다. 

왜냐하면 죽음은 삶이 만든 최고의 발명품일 테니까요. 

죽음은 삶의 변화를 가능하게 하는 동력입니다.
죽음은 낡은 것을 없애고 새로운 것에 길을 내어줍니다. 

여러분도 언젠가는 죽을 것입니다. 

그러니 다른 사람의 인생을 사느라 자기 삶을 허비하지 마십시오. 
다른 사람이 생각하는 결과에 맞춰 살아야한다는 도그마에 빠지지 마십시오. 

다른 사람들이 시끄럽게 떠드는 소리에 파묻혀, 여러분 내면의 소리를 잃지 마십시오. 
용기를 갖고 여러분의 마음과 직관을 따라가십시오. 

여러분의 마음은 스스로가 진정 무엇이 되고 싶은지 이미 알고 있습니다"

Stay Hungry Stay Foolish


- Stanford Report, June 14, 2005  

 



      ≫a  |  2011. 10. 6. 11:13
ghd
2013.07.19 20:38 댓글에 댓글수정/삭제
당신 매력있어, 자기가 얼마나 매력있는지 모르는게 당신매력이야
.
ghd
2013.07.22 15:51 댓글에 댓글수정/삭제
희미한 달빛이 샘물 위에 떠있으면,나는 너를 생각한다.
.
name ::   password :: blog :: secret
등록





탤런트 최명길의 남편인 김한길이 초대 문화부 장관이었던
 
이어령 선생님의 딸 이민아씨와 이혼한 뒤 쓴 글의 일부.


결혼생활 5년 동안, 우리가 함께 지낸 시간은 
그 절반쯤이었을 것이다. 



그 절반의 절반 이상의 밤을 나나 그녀 가운데 하나 
혹은 둘 다 밤을 새워 일하거나 공부해야 했다. 
우리는 성공을 위해서 참으로 열심히 살았다. 
모든 기쁨과 쾌락을 일단 유보해 두고, 
그것들은 나중에 더 크게 왕창 한꺼번에 누리기로 하고, 

우리는 주말여행이나 영화구경이나 댄스파티나 쇼핑이나 피크닉을 극도로 절제했다. 


그 즈음의 그녀가 간혹 내게 말했었다. 
"당신은 마치 행복해질까봐 겁내는 사람 같아요."
그녀는 또 이렇게 말하기도 했다. 
"다섯 살 때였나봐요. 어느 날 동네에서 놀고 있는데 
피아노를 실은 트럭이 와서 우리집 앞에 서는 거예요. 
난 지금도 그때의 흥분을 잊을 수가 없어요. 
우리 아빠가 바로 그 시절을 놓치고 몇 년 뒤에 피아노 백 대를 
사줬다고 해도 나한테 내게 그런 감격을 느끼게 만들지는 못했을 거예요"


서울의 어머니는 어머니대로 내게 이런 편지를 보내시곤 했다. 
"한길아, 어떤 때의 시련은 큰 그릇을 만들어내기도 하지만, 
대개의 경우 시련이란 보통의 그릇을 찌그러뜨려 놓기가 일쑤란다"


애니웨이, 미국생활 5년만에 그녀는 변호사가 되었고 
나는 신문사의 지사장이 되었다. 
현재의 교포사회에서는 젊은 부부의 성공사례로 일컬어지기도 했다. 
방 하나짜리 셋집에서 벗어나, 
바다가 내려다보이는 언덕 위에 3층짜리 새 집을 지어 이사한 한 달 뒤에, 
그녀와 나는 결혼생활의 실패를 공식적으로 인정해야만 했다. 


바꾸어 말하자면, 이혼에 성공했다.


그때그때의 작은 기쁨과 값싼 행복을 무시해버린 대가로. 


- 김한길『눈뜨면 없어라』中 


.
.
.

현재를 잡아라!

      ≫a  |  2011. 2. 20. 22:27
2013.07.19 04:21 댓글에 댓글수정/삭제
사람들은 죽을걸 알면서도 살잖아 .사랑은 원래 유치한거에요
.
2013.07.20 07:24 댓글에 댓글수정/삭제
창밖을 봐 바람에 나뭇가지가 살며시 흔들리면 네가 사랑하는 사람이 널 사랑하고 있는거야.
.
ghd
2013.07.22 11:50 댓글에 댓글수정/삭제
다른 남자 부르면서 울거면 나한테 이쁘지나 말던지
.
name ::   password :: blog :: secret
등록





* View subtitles 를 누르시면 한글 자막을 볼수 있습니다.

회의는 진짜 일이 아닙니다.
정말 일을 할수 있는 환경을 만드세요.

      ≫a  |  2011. 2. 10. 12:10
ghd
2013.07.24 18:47 댓글에 댓글수정/삭제
좋으면 좋고 싫으면 싫은 거지, 뭐가 이렇게 어렵고 복잡하냐구
.
name ::   password :: blog :: secret
등록





 
* View subtitles 를 누르시면 한글 자막을 볼수 있습니다.




리더를 바라보는 조금은 다른 시각.
우리가 모두 리더가 되어야 한다는 것은 정말이지 효과적이지 못합니다.

따를 수 있는 용기를 가지십시요.

      ≫a  |  2010. 8. 29. 18:29
ghd
2013.07.20 09:06 댓글에 댓글수정/삭제
희미한 달빛이 샘물 위에 떠있으면,나는 너를 생각한다.
.
name ::   password :: blog :: secret
등록




각 기능의 비용이 제대로 계산되지 않은 체 기능 중심으로만 설계된 제품을 많이 볼 수 있습니다.

제품을 이해하고 사용하기 어렵게 만드는 기능은 소비자에게 오히려 부정적인 요소입니다. 

사람들이 좋아하는 제품은 딱 필요한 기능을 하는 제품입니다. 

제대로 된 기능을 하는 제품을 설계하는 것이 기능만 많은 제품을 설계하는 것보다 훨씬 더 어렵습니다.

기능을 추가하기 위해서는 명세를 정하고, 설계하고 개발하는 비용이 필요합니다.
거기에다가 테스트 비용까지 포함됩니다. 

기능이 많으면 많을수록 문제를 일으키거나 또는 다른 부분과 이상하게 상호작용할 기능이 많아질 가능성이 높아집니다.

소프트웨어 시스템에서 저장 비용은 이제 거의 무시해도 될 문제가 됐지만 모바일 어플리케이션에서는 여전히 중요한 문제입니다. 또한 무어의 법칙이 배터리에는 적용되지 않기 때문에 실행 비용의 상승도 무시 못할 문제입니다.

기능의 추가는 문서화 비용도 관련돼 있습니다. 
모든 기능은 메뉴얼에 페이지를 가중시키고 이를 익히기 위한 비용도 증가시킵니다. 

소수의 사용자에게만 가치를 제공하는 기능들은 그 외 대다수의 사용자에게 불필요한 비용 추가라는 짐을 지우게 됩니다.
그러므로 제품이나 프로그래밍 언어를 설계할 때는 제대로 된 핵심 기능들, 즉 좋은 점만을 포함해야 합니다. 

이런 기능들만으로도 필요한 것을 대부분 할 수 있습니다.
우리는 사용하는 제품들에서 좋은 점(good parts)만을 찾아낼 수 있습니다. 

단순함이야말로 가치가 있으며 먄약 단순하게 제공되지 않는다면 우리가 직접 단순화 할 수 있습니다. 

필자의 전자레인지는 정말 많은 기능들이 있습니다. 하지만 필자가 사용하는 기능은 단순히 시계와 조리 기능뿐입니다.  그런데 시계의 경우는 시간을 맞추는 일조차도 도전적입니다.

우리는 좋은 점만을 찾고 이것들만 사용함으로써 기능 위주 설계로 인한 복잡함에 대처할 수 있습니다.
제품이든지 프로그래밍 언어이든지 간에 좋은 점(good parts)으로만 설계된다면 좋을 것입니다.

Javascript The Good Parts chapter 10 (p.165)
아름다운 속성에 대한 단상 

- Douglas Crockford
      ≫a  |  2010. 7. 23. 01:20
ghd
2013.07.19 10:00 댓글에 댓글수정/삭제
사람들은 죽을걸 알면서도 살잖아 .사랑은 원래 유치한거에요
.
name ::   password :: blog :: secret
등록







많은 회사와 개발자들이 자바로부터 새로운 언어인 Ruby, Python, Groovy, Erlang, Scala 등으로 이동했습니다.  당신은 어쩌면 자바에 잡혀 있을것 입니다.

당신이 자바에 잡혀있더라도, 당신은 당신의 프로그래밍 스타일을 바꿀 수 있고, 새로운 언어로부터 여러 이점을 취할수 있을것 입니다. 최근 15년 동안 자바의 프로그래밍 스타일은 매우 많이 변했습니다.


  1. Final is your new love
    내가 일했던 팀에 수많은 자바 프로그래머들은 final을 사용하기 시작했습니다. 변수를 
    Final로 만드는 것은 변수가 변경되는 것을 방지해 줍니다. 당신이 변수의 값을 재할당 하려고 한다면 많은 경우 이것은 버그가 될것이기 때문에 당신은 새 값을 위해서 새로운 변수를 사용해야 합니다. Final은 버그를 방지해 주고 당신의 코드를 좀 더 읽기 좋고 이해하기 좋게 만들어 줄것입니다. 모든 변수를 불변으로 작성하십시요.

    final Foo bar = new Foo();

    이것에 대해서 다음 링크에 조금 더 적었습니다.  
    “All variables in Java must be final”.

  2. No setters
    많은 자바 개발자들은 자동으로 - 가끔씩 IDE 라는 악마의 도움을 얻어서 - 자신의 글래스의 모든 fields에 대한 setters를 적습니다. 당신은 setters를 사용하지 않아야 합니다. 당신이 원하는 각 setter에 대해서 생각해 봅시다. 정말로 그 setter들이 그 field에 대해서 필요한 것입니까? 만약 값의 변경이 필요하다면, 새 객체를 만드는것이 낫습니다. 그리고 또 코드를 getters없이 작성해 보세요. 

    다음 글이 당신에게 이 컨셉에 대해서 말해줄 것입니다. 
    Tell, don’t ask 

  3. Do not use loops for list operations
    함수형 언어로부터 배웁시다. 반복(looping)은 collections를 다루는데 있어서 가장 좋은 방법이 아닙니다. 만약 우리가 persons의 list로부터 맥주를 마시는 사람(who can drink beer)을 걸러(filter)낸다면 아마도 반복(loop) 버전은 아래와 같을것 입니다.

    List<Person> beerDrinkers = new ArrayList<Person>(); 
    for (Person p: persons) { 
        if (p.getAge() > 16) { 
              beerDrinkers.add(p); 
        } 
    }


    이것은 보다 함수형 언어 스타일 - 심지어 자바도 - 로 적혀질 수 있습니다. 예제로 구글 컬렉션의 filter가 있습니다. ex) 
    google filter

    Predicate<HasAge> canDrinkBeer = new Predicate<HasAge>() { 
        public boolean apply(HasAge hasAge) { 
                return hasAge.getAge() > 16; 
        } 
    };
    List<Person> beerDrinkers = filter(persons, canDrinkBeer);


    Dave Jarvis이지적했듯이, 나는 getter를 버렸고, 그의 말이 맞았습니다.  ;-)

    Predicate canDrinkBeer = new Predicate() { 
        public boolean apply(HasAge hasAge) { 
            return hasAge.isOlderThan( 16 ); 
        } 
    };

    보다 좋은 코드가 되도록 아래 적어봅시다:

    Predicate canDrinkBeer = new Predicate() { 
        public boolean apply( HasAge hasAge, HasAge otherAge ) { 
            return hasAge.isOlderThan( otherAge ); 
        } 
    }


    술어(predicate) 버전은 약간 더 코드가 길지만, 두 부분으로 구성되어 있습니다. 각 한가지가 보다 이해하기가 쉽습니다.  반복(loop) 버전은 새로운 요구사항에 의해서 빠르게 가독성이 떨어집니다. 그러나 함수형 버전은 쉽게 결합될 수 있습니다

    List beerDrinkers = filter(filter(persons, canDrinkBeer), isMale);


    이것에 대한 더 많은 내용은 다음 링크에 있습니다.  
    Metaphysical Developer.


  4. Use one liners
    간결한 코드를 적으세요. 자바는 시끄러운 언어입니다.  그러나 필요 이상으로 잡음을 만들지 말아야 합니다.

    다음과 같이 적는 대신, 
    public int add( int a, int b ) { 
        int result = a + b; 
        return result; 
    }


    다음과 같이 적으십시요.
    public int add(int a, int b) { return a + b; } 

    IDEA와 가능한 다른 IDE들은 당신이 원하기만 한다면 한줄 포멧을 유지하는 것을 허용합니다.



  5. Use many, many objects with many interfaces
    Domain driven design 현재 많은 사람들의 관심(makes a big splash)을 끕니다
    . class는 많은 role로 나눠지고 많은 interfaces가 구현됩니다. 그리고 class는 재사용 됩니다.

    public class Person implements Nameable, Hireable, LivesAt { 
        ... 
    } 

    public interface Nameable { 
        String getName(); 
    } 


    Method는 어떤 종류로서가 아니라, 오직 한가지 역할로만 쓰여져야 합니다.  이런 종류의 methods들은 보다 많은 objects들과 동작할수 있고, 또다른 이점으로 결합도를 낮춰줄 것입니다  

    public void print( Nameable name ) {
         System.out.println( name.getName() ); 
    } 

    이것에 대해서 다음 링크에 보다 자세히 적었습니다. “Never, never, never use String in Java “.



  6. Use Erlang-Style Concurrency
    lock이나 synchronized와 같은 자바의 동시성에 대한 원시값은 너무 low level이며 종종 너무 쓰기가 어렵다는 것이 증명되었습니다.  여기에 보다 나은 방법의 동시성 코드를 쓰는 방법이 있습니다.  Erlang Style 동시성이 그것들 중에 하나입니다. – 자바에서 그것을 얻는 방법은 매우 다양합니다. – 나는 다음 링크(here)에서 그것들에 대해서 적었습니다. Akka 나Actorom.과 같이 새로운 것들도 있습니다.  당신은 또한 Join/Fork를 사용할 수도 있고 혹은 java.util.concurrent의 수많은 자료구조를 사용할 수도 있습니다.


  7. Use Fluent Interfaces. 
    유연한 interfaces 는 코드를 보다 짧고 읽기 쉽게 만듭니다. 아주 좋은 예로 Google Collections의 MapMaker API가 있습니다. 

    ConcurrentMap graphs = new MapMaker() 
        .concurrencyLevel(32) 
        .softKeys() 
        .weakValues() 
        .expiration(30, TimeUnit.MINUTES) 
        .makeComputingMap( 
            new Function() { 
                public Graph apply(Key key) { 
                    return createExpensiveGraph(key); 
                } 
             });



  8. Data Transfer Objects without setters and getters. 
    당신이 간단한 data holders나 혹은 data transfer objets를 가지고 있다면 getters와 setters 같은 지저분한 코드를 절대로 적지 마십시요. 나는 이것이 자바에서 이단이란것을 알고 있습니다. 그래도 public field를 사용하세요.

    다음 같이 쓰는 대신에


    public class Point { 
        private int x; 
        private int y; 

        pulic Point(int x, int y) { 
            this.x = x; 
            this.y = y; 
        } 
        public int setX(int newX) { 
            x = newX; 
        } 
        public int getX() { 
            return x; 
        } 
        ... 
    } 
    ... 
    int x = p.getX(); 
    int y= p.getY();


    다음과 같이 적으세요


    public class Point { 
        public final int x; 
        public final int y; 

        pulic Point(int x, int y) { 
            this.x = x; 
            this.y = y; 
        } 
    } 
    ... 
    int x = p.x; 
    int y = p.y;

    Refactoring은 쉽습니다. 정말 이것이 필요할가요? 만약 당신이 모든 코드를 다루지 않고 이런 습관을 지녔다면, 당신은 보다 조심할 필요가 있습니다.



이 팁으로 자바 코드가 더 좋아질 것입니다. 이것들을 당신의 다음 Java class에 적용해 보십시요. 어떻게 생각하시죠? 나는 당신의 당신의 자바 코딩 스타일이 지난 10년간 어떻게 변해 왔는지를 듣고 싶습니다.


August 10, 2009 by Stephan Schmidt
      ≫a  |  2010. 5. 1. 15:19
2013.07.21 21:08 댓글에 댓글수정/삭제
당신 매력있어, 자기가 얼마나 매력있는지 모르는게 당신매력이야
.
name ::   password :: blog :: secret
등록






살다 보면 꼭 한번은 재수가 좋든지 나쁘든지 천재를 만나게 된다. 대다수 우리들은 이 천재와 경쟁하다가 상처투성이가 되든지, 아니면 자신의 길을 포기하게 된다. 그리고 평생 주눅 들어 살든지, 아니면 자신의 취미나 재능과는 상관없는 직업을 가지고 평생 못 가본 길에 대해서 동경하며 산다. 

이처럼 자신의 분야에서 추월할 수 없는 천재를 만난다는 것은 끔찍하고 잔인한 일이다. 어릴 때 동네에서 그림에 대한 신동이 되고, 학교에서 만화에 대한 재능을 인정받아 만화계에 입문해서 동료들을 만났을 때, 내 재능은 도토리 키 재기라는 것을 알았다. 그러나 그 중에 한두 명의 천재를 만났다. 나는 불면증에 시달릴 정도로 매일매일 날밤을 새우다시피 그림을 그리며 살았다.

내 작업실은 이층 다락방이었고 매일 두부장수 아저씨의 종소리가 들리면 남들이 잠자는 시간만큼 나는 더 살았다는 만족감으로 그제서야 쌓인 원고지를 안고 잠들곤 했다. 그러나 그 친구는 한달 내내 술만 마시고 있다가도 며칠 휘갈겨서 가져오는 원고로 내 원고를 휴지로 만들어 버렸다. 

나는 타고난 재능에 대해 원망도 해보고 이를 악물고 그 친구와 경쟁도 해 봤지만 시간이 갈수록 내 상처만 커져갔다. 만화에 대한 흥미가 없어지고 작가가 된다는 생각은 점점 멀어졌다. 

내게도 주눅이 들고 상처 입은 마음으로 현실과 타협해서 사회로 나가야 될 시간이 왔다. 그러나 나는 만화에 미쳐 있었다. 

새 학기가 열리면 이 천재들과 싸워서 이기는 방법을 학생들에게 꼭 강의한다. 그것은 천재들과 절대로 정면승부를 하지 말라는 것이다. 천재를 만나면 먼저 보내주는 것이 상책이다. 그러면 상처 입을 필요가 없다. 

작가의 길은 장거리 마라톤이지 단거리 승부가 아니다. 천재들은 항상 먼저 가기 마련이고, 먼저 가서 뒤돌아보면 세상살이가 시시한 법이고, 그리고 어느 날 신의 벽을 만나 버린다. 

인간이 절대로 넘을 수 없는 신의 벽을 만나면 천재는 좌절하고 방황하고 스스로를 파괴한다. 그리고 종내는 할 일을 잃고 멈춰서 버린다. 

이처럼 천재를 먼저 보내놓고 10년이든 20년이든 자신이 할 수 있다는 생각으로 하루하루를 꾸준히 걷다 보면 어느 날 멈춰버린 그 천재를 추월해서 지나가는 자신을 보게 된다. 산다는 것은 긴긴 세월에 걸쳐 하는 장거리 승부이지 절대로 단거리 승부가 아니다. 

만화를 지망하는 학생들은 그림을 잘 그리고 싶어한다. 그렇다면 매일매일 스케치북을 들고 10장의 크로키를 하면 된다.1년이면 3500장을 그리게 되고 10년이면 3만 5000장의 포즈를 잡게 된다. 그 속에는 온갖 인간의 자세와 패션과 풍경이 있다. 

한마디로 이 세상에서 그려보지 않은 것은 거의 없는 것이다. 거기에다 좋은 글도 쓰고 싶다면, 매일매일 일기를 쓰고 메모를 하면 된다. 가장 정직하게 내면 세계를 파고 들어가는 설득력과 온갖 상상의 아이디어와 줄거리를 갖게 된다. 

자신만이 경험한 가장 진솔한 이야기는 모두에게 감동을 준다. 만화가 이두호 선생은 항상 “만화는 엉덩이로 그린다.”라고 후배들에게 조언한다. 이 말은 언제나 내게 감동을 준다. 평생을 작가로서 생활하려면 지치지 않는 집중력과 지구력보다 더 중요한 것은 없다. 

가끔 지구력 있는 천재도 있다. 그런 천재는 존재하는 것만으로도 축복이고 보는 것만으로도 감사하다. 그런 천재들은 너무나 많은 즐거움과 혜택을 우리에게 주고 우리들의 갈 길을 제시해 준다. 나는 그런 천재들과 동시대를 산다는 것만 해도 가슴 벅차게 행복하다. 

나 같은 사람은 그저 잠들기 전에 한 장의 그림만 더 그리면 된다. 해 지기 전에 딱 한 걸음만 더 걷다보면 어느 날 내 자신이 바라던 모습과 만나게 될 것이다. 그것이 정상이든, 산중턱이든 내가 원하는 것은 내가 바라던 만큼만 있으면 되는 것이다.

만화가 이현세.


변화는 어떤 큰 결심에서 오지 않는다.
작은 실천이 모여서 결국 큰 변화를 만든다. 

꾸준히, 그리고 빠르게.


      ≫a  |  2009. 12. 1. 08:58
name ::   password :: blog :: secret
등록



blueiur's Blog is powered by Daum