2015년 3월 26일 목요일

[퍼즐] 잘못된 주소 또는 엉뚱한 모자 문제

여기에 5개의 목적지가 다른 편지와 각각의 주소가 적힌 편지 봉투 5개가 있다.
실수로 모든 편지를 잘못된 주소로 보낼 경우의 수는 몇인가?

변형된 다른 문제는 7개의 모자와 7명의 모자 주인이 있는데, 모든 모자 주인들이
엉뚱한 모자를 가져갈 경우의 수는 몇인가?

이 문제를 처음 접한 지는 꽤 되었는데,
이것에 교란순열(derangement)이라는 수학용어가 있었다.
(예를 들어 n개가 모두 잘못된 위치로 놓이는 방법은 !n 으로  쓴다.)

이 문제의 답을 스스로 생각해 내는 것은 항상 헷갈린다.


2015년 3월 17일 화요일

[퍼즐] 이상한 학교 인사

먼저 내가 접한 퍼즐 문제는 다음과 같다.

" 어떤 학교에는 이상한 인사방법이 있다. 모든 남학생들은 남학생끼리 서로에게 인사를 한 뒤, 선생님에게 인사를 한다. 한편, 모든 여학생들도 여학생들 끼리  서로에게 인사를 한 뒤,
선생님에게 인사를 한다. 마지막으로 모든 남학생들이 여학생들에게 인사하고, 여학생들도 남학생에게 인사를 한다. 이렇게 모두 900번의 인사를 한 뒤에야 수업이 시작된다. 이 학교의 여학생 수는 남학생의 2배라고 하고, 선생님은 답례를 하지 않는다고 할 때, 이 학교의 남학생 수는 얼마인가? "

원래 문제에서는 선생님이 답례를 한다는 것인지가 명확히 써 있지 않아서 헷갈렸다.

다음은 내가 변형 시켜 본 문제이다.

"다음해에 신입생들은 전통에 따라 같은 방식으로 인사를 하지만,
담임 선생님은 학생에 따라 내키는 대로 인사를 하기도 하고, 안하기도 한다.
모든 인사 수의 합이 정확히 얼마인지 모르지만, 대략 400 보다는 많고,
440 보다는 적다고 할 때, 올 해의 신입생 수는 얼마인가?"

풀이는 아래 클릭..

2015년 1월 18일 일요일

python fitting / optimization

주어진 xdata와 ydata에 대해,
Least square method로 data를 fitting 하는 방법.

결론은 , scipy의 optimize module을 이용한다.

import scipy.optimize as optimization

def func(x,para1,para2):
   return para1*sin(para2*x)

popt, pcov = optimization.curve_fit(func,xdata, ydata, p0=(1.0,1.0))

p0는 initial guess이고

popt는 parameter fitting 의 결과를, pcov는 covariance 계산 결과를 보여준다.

least square method를 사용하므로,
cost function chi(para...) 함수를 최소로 만드는 parameter를 찾는다.

pcov는 (parameter 갯수)*(parameter 갯수) matrix로,
cost function의 parameter 값의 변화에 대한 변화값을 나타낸다.
pcov(i,j)= d^2[chi(c1,c2..)]/dc_i dc_j

몇가지 다른 fitting 방법이 있다.

1. scipy.optimize.curve_fit : 
   입력: f(x,para) , xdata, ydata, yerr(optional)

    popt, pcov = optimization.curve_fit(f,xdata, ydata, p0=(1.0,1.0))

   curve_fit은 least square 방법을 통해  sum ( ydata - f(xdata,para))^2/yerr^2  
   을 minimize 시킨다. 
   parameter의 error estimation은 sqrt(diag(pcov)) 를 이용한다.

2. scipy.optimize.leastsq :
   입력: errFunc(para,x,y) , xdata, ydata 

    popt, hess_inv, infodict, errmsg, success = optimize.leastsq(errFunc, pstart, args=(xdata, ydata), full_output=1)   

    입력하는 함수는 errFunc(para,xdata,ydata) = ydata - f(xdata,para) 
    이고,  sum ( errFunc )^2 를 minimize 시킨다. 
    parameter의 error estimation은 hess_inv 와 residual variance 를 이용한다. 
    sqrt( diag( hess_inv * resVariance)) with 
    resVariance = sum( errFunc(para,xdata,ydata)^2) /(len(ydata)-len(para)) 

3. scipy.optimize.minimize :
    입력: minFunc(para,x,y) , xdata, ydata 
    
    result = optimize.minimize(lambda p,x,y: np.sum( errFunc(p,x,y)**2 ), pstart, args=(xdata, ydata))

    이 경우 입력함수 
    minFunc(para,xdata,ydata) = sum ( ydata- f(xdata,para))^2 이고, 
    minFunc을 minimize 시킨다.  parameter의 error estimation은 leastsq 와 같이
    result.hess_inv 와 residual variance 을 이용한다. 

    그러나, minimization의 방법에 따라 hess_inv가 제공되지 않는 경우가 있다. 





2014년 12월 7일 일요일

(퍼옴) 미루는습관고치기

Q: 머리 속에는 해야 할이 꽉 차있지만 정작 실행에 옮기지 못하고 일을 자꾸 미루는 습관이 있어요. 막상 일을 시작해도 마무리 짓지 못하고, 다 른 사소한 일에 매달리는 경우도 많구요. 미루는 만큼 쌓여가는 일들이 많아지다보니, 점점 더 하기 싫어지고 무기력해지는 것 같아요. 어떻게 하 면 좋을까요?

A: 조금씩 일을 미루다 보면 작은 일들이 산더미처럼 쌓여 마음을 더 짓누르게 되지요. 그래도 미루는 습관을 고치겠다는 마음을 가지셨으니 시작 이 반입니다. 이제부터 저와 함께 미루는 습관에서 벗어나는 길을 찾아 보아요.

첫째, 모든 것을 완벽하게 하겠다는 강박관념 때문에 일을 미루고 있다면, 기대수준을 조금 낮춰보세요. 실수하지 않고 완벽하게 처리하려면, 챙겨 야 할 게 참 많아집니다. 혹시라도 빠트리는 것이 있을까봐, 이것 저것 챙기다 보니 정작 중요한 일에 손을 대지 못하고 시간을 흘려 보냅니다. 결 과도 완벽할 것을 기대하니, 마음에 드는 성과가 드러날 것 같지 않으면 아예 시작도 못하는 경우가 많지요. 정작 일을 시작해놓고도, "내가 잘하고 있는가?, 제대로 하고 있는 걸까?"라는 자기검열의 생각 때문에 주춤주춤 거리고 일의 속도가 안납니다. 따라서, 100% 완전하게 해내겠다는 마음보다는 일단 70-80%만 도달해보자는 마음을 가져 보면 좋겠지요. 또, 큰 목표를 작은 덩어리로 나눠서 작 은 일부터 시작해보셔도 좋겠습니다. 집 전체를 다 정리하려고 하면 엄두가 나지 않지요. 하지만 방 하나, 혹은 방의 한쪽 일부분만 치운다는 마음 으로 시작하는 겁니다. 마치 지렛대의 원리처럼, 모든 일을 다 할 수는 없더라도, 작은 일을 하나 시작함으로써, 미뤄뒀던 큰 일을 하게 되는 시작 이 되는거지요.

둘째, 일을 미루면서 무기력한 상태에 빠져있다면, 작은 시도를 할 수 있도록 자기 자신을 격려해주세요. 누구나 마음 속에는 "네 이놈.. 똑바로해 야지"라고 높은 가치기준이나 도덕적 명령에 도달하도록 자신을 부추기는 상전의 목소리가 있습니다. 상전은 항상 "~~해야만 한다"고 명령하며, 하인의 게으름을 질타하고 몰아부칩니다. 하인이란 억압된 인격의 측면으로, 늘 꾸지람을 듣는 내면의 아이를 나타냅니다. 건강하지 못한 인격은 내면에서 상전과 하인이 서로의 입장을 존중하지 못하고 분열되어 팽팽한 싸움을 하며, 창조적인 에너지를 고갈시키게 됩니다. 이러한 상태를 신 경증적인 '자기고문게임'이라 하지요. 상전은 완벽을 추구하기에 하인이 도달할 수 없는 이상을 요구하며 하인을 야단치고, 하인은 다음에는 잘하 겠다고 하면서도 역시 말뿐 행동은 오히려 꾸물거리고 일을 회피함으로써 결국 상전과의 게임에서 승리를 합니다. 상전이 시키는 일이 하기 싫어 늦장을 부리거나 딴짓을 해서 속을 태우는거지요. 혹시 내가 어떤 일을 미루고 있다면, 내 안에서 저항하고 있는 것은 아닌지, 이러한 자기고문게 임에서 무기력한 상황에 빠져있는 것은 아닌지 살펴보시기 바랍니다. 만일 그렇다면, 스스로를 따뜻한 시선으로 바라봐주십시오. 마치 걸음마를 처음 배우는 어린아이가 비록 넘어지더라도 따뜻한 미소로 박수쳐주는 엄마의 시선처럼요. 자신의 부족하고 서툰 시도를 아무런 평가나 비판없이 바라보고, 뭐라도 시작했다는 것에 스스로를 격려하시기 바랍니다. 남 과 비교하지 말고, 적어도 내가 어제 시도하지 못했던 것을 오늘 해보았다는 것 만으로도 자신을 축하해주세요. 작은 시도와 작은 성공이 다음 발 걸음으로 이어지니까요.

셋째, 너무 많은 것을 고려하면서 결정을 미루고 있다면 선택의 가짓수를 제한해보세요. 예전에는 물건을 하나 사더라도 한정된 몇가지 중에 고르 면 그만이었지만, 이제는 최선의 선택을 위해 인터넷검색과 다양한 매체를 통해 관련 상품정보와 가격대를 비교하며 결정을 하게 됩니다. 최상의 선택을 하려고 애쓰면 애쓸수록 더 많은 선택의 가짓수를 넓히게 되고, 결국 선택을 미룰 수 밖에 없어집니다. 최선의 선택을 위해 시간을 미루는 것이 신중하다고 볼 수도 있지만, 선택을 미룸으로써 얻게 되는 손실도 생각해야겠지요. 예를 들어 새로운 컴퓨터를 구입하기 위해 온갖 사양을 비 교검토하느라 한두달을 지연하다보면, 더 업그레이드된 제품이 나올때마다 의사결정은 더 어려워집니다. 필요한 상황에 컴퓨터를 사용하지 못하 면서 제품비교에 들이는 시간비용까지는 고려한다면, 차라리 내가 필요한 그 순간에 적절한 사양과 가격에 맞는 제품을 구입하여 사용하는 것이 더욱 경제적인 선택이겠지요. 따라서 되도록 선택의 가짓수를 제한하는 것이 좋습니다. 시행착오를 겁내지 말고, 실험을 해본다는 마음으로 선택에 임하는 것도 좋을 것입니다. 생활을 단순화시키는 것도 일을 미루는 습관에서 벗어날 수 있는 방법입니다. 너무 많은 것을 관리하는데 들이는 시간을 줄일 수 있으니까요.

넷째, 벼락치기에 익숙해져 습관적으로 일을 미루고 있다면, 나만의 데드라인을 설정해보세요. 마감이 코앞에 닥치면 압박감 때문에 아드레날린이 분비되면서 광적인 에너지로 막판투혼을 펼칠 수 있습니다. 짧은 기간에 고도의 집중력을 발휘 하여 일을 해치우기도 하지요. 이러한 성취감에 '어떻게든 나는 해낸다'는 생각이 은연중에 쌓이면서 미루는 습관이 강화되기도 합니다. 또한 조금 부족한 결과에 대해 변명거리도 제공합니다. " 능력이 부족해서가 아니라 시간이 부족했을 뿐이라고" 변명하면서도 그 다음에 일을 할 때도 다시 미루는 습관은 여전합니다. 하지만, 이런 일이 반복되면 내성이 생기면서 끝낼 시간이 다가와도 더 이상 긴장되지 않고 집중력도 발휘되지 않습니 다. 넉넉한 시간이 주어져도 결국 끝내야 할 시간에 맞춰 일을 시작하기 때문에 미루기가 고질적인 습관으로 변하기도 합니다. 따라서, 마감일과 별도로 나만의 데드라인(Dedline), 즉 사선(死線)을 정해 보는 겁니다. 최종마감일 전에 중간 데드라인을 만들어두는 것도 좋겠 죠. 월말까지 마쳐야 할 보고서라면, 중순까지는 최소한 전체개요를 작성해 보는거지요. 또한 일을 끝내는 시점이 아닌, 일을 시작할 시간, 즉 개시 데드라인을 정해놓는 것도 유용한 방법입니다. 나중에 해야지 라고 막연하게 미루기보다는 다음 주 월요일까지는 어떻게든 시작하겠다고 마음 먹 는 거지요. 시작이 반이니까요. 단숨에 일을 해치울 수 없어 마냥 미루고만 있다면, 우선 한 시간 만 혹은 30분만 해보자고 마음먹고 시작해 보는 겁니다. 완성을 목표로 하는 것이 아니라, 정해진 시간 안에서 얼마나 해내는지 확인할 수 있으니, 좀더 현실적인 계획을 세울 수도 있겠지요.

이제 11월입니다. 얼마 남지 않은 한 해를 바라보며, 지금까지 내가 뭘 했지?라고 반문하고 계시지는 않으신가요? 쫓기는 마음에 허둥대다가 정작 중요한 일을 또 다시 미루고 있지는 않으신가요? 지금 이순간, 무엇을 하고 싶은지, 어떤 일을 해야 하는지 살펴보시고, 작은 것이라도 시작해보시 기 바랍니다. 미루는 습관 역시 단번에 완벽하게 고쳐지는 것은 아니까요. 일단 나 자신을 실험을 해본다는 마음으로 작은 시도를 해보세요. 당신의 작은 실험이 성공하시길 바랍니다.

칼럼리스트 : 이상희 삼성생활문화센터 상담실장

2014년 11월 26일 수요일

Brain teaser

This problem may look trivial, but actually it took some time for me to solve.
It was fun in a way. So, the problem is


The answer is

2014년 10월 18일 토요일

ssh 로 특정 폴더/디렉토리로 바로 접속하기 및 설정


ssh -t [id@][xxx.xxx.xxx.xxx] "cd [destination] ;exec \$SHELL -l"

# 오래된 서버에 접속하려니 ssh-rsa 나 ssh-dss 를 사용하라고 할 경우

(1) 설정파일 만들기 "~/.ssh/config" file에 아래 내용 추가 
HOST [hostname]
     HostName [address]
     User [user_id]
     HostKeyAlgorithms=+ssh-dss
(2) 이제 ssh [hostname] 으로 접속할 수 있다. 
    

2014년 9월 1일 월요일

젓가락과 숟가락

요즘에 사람들이 밥먹는 모습을 보면 숟가락을 보다는 젓자락을 사용하여 밥을 먹는 모습이 많이 보인다. 국이나 비빔밥같이 젓가락을 사용하기 어려운 경우를 제외하고는 대부분의 경우 젓가락을 사용하여 밥을 먹는 것 같다. 예전에는 그렇지 않았던 것 같은데, 왜 일까? 쌀을 주식으로 하는 아시아의 많은 나라에서 젓가락을 도구로 사용하는 것은 흔하지만, 숟가락을 이용하여 쌀을 먹는 것은 우리나라만의 특징이 아닐까 생각한다. (다른 나라에서 그렇게 먹는 경우를 보지 못한 것 같다.) 그런데, 왜 그러한 모습을 보기가 힘들어 지는 것일까?( 적어도 공공 식당에서 내가 관찰한 바로는 그렇다.)

생각나는 이유는

(1) 숟가락을 밥을 떠서 먹는 것이 보기 안 좋아서?
(2) 숟가락과 젓가락을 함께 쓰는 것이 귀찮아서?
(3)  외국(일본, 중국)의 영향?
(4) 건강을 위해서? ( 젓가락을 사용하면, 국물의 섭취가 적어지므로  나트륨 섭취를  줄일 수 있고, 조금씩 먹게 되므로 소식에 도움이 된다고 생각할 수 있다.)

내 경우에는 (1), (2) 번이 복합적인 것 같다. 다른 사람들은 어떤지 궁금하다.