[책 리뷰] 지리의 힘

이미지
 이 책 원문 제목은 지리의 죄수들 (Prisoners of Geography)이다. 음 그냥 영어로 읽었을 때 무슨 책 제목을 지리의 힘 따위로 번역하나 했는데 직역해보니 지리의 힘이 훨씬 나은 것 같다. 이 책에서 하는 얘기는 간단하다. 현재 일어나고 있는 국가 간의 분쟁, 국가의 흥망성쇠는 지리적인 영향 때문이라는 것이다. 미국이 세계 최고의 강대국이 된 것도, 중국이 현재 취하고 있는 국제적인 행동을 지리적인 관점에서 해석한 책이다. 물론 지리적인 영향이 있기전에 인간의 선택이 있기는 하다. 땅을 차지하고 나서보니 지리적인 이점을 누릴 수 있는 곳인 경우도 있고, 지리적 이점을 취하기 위해 그 땅을 차지한 경우도 있다.  그리고 지리적인 요소에 가장 영향을 주는 것은 당연히도 '물'이다. 일차적으로는 강이 제일 중요한 요소고 그 다음은 바다이다. 강은 나라의 번영에도 그리고 자국 영토에도 매우 중요한 요소이다. 먼 과거뿐만 아니라 오늘날에도 말이다. 큰 강 유역을 끼고 있는 나라들은 전부 번성했다. 물론 수원지로부터 바다로 흘러가기 전까지 강 유역의 고도 변화가 심하지 않는다는 조건이 있지만.... 이 조건에 만족하지 못하는 나라는 큰 강을 끼고있어도 그 혜택을 누리지 못하는데 그 대표적인 예가 브라질이다. 브라질은 아마존이라는 큰 강을 갖고 있지만 바다에서 아마존 강을 이용해 내륙으로 들어가는 것이 힘들다고 한다. 그래서 브라질의 대도시는 해안가에 집중되어 있다고 한다. 인위적으로 브라질리아 같은 도시를 내륙에 만들기는 했지만 이런 지리적인 도움을 받지 않는 도시는 한계가 있다고 한다.  그 다음 중요한 요소인 바다는 타국과의 교류에 필수적인 요소이다. 국경을 맞대고있는 나라가 있을수도 있지만 그 숫자는 한정적이고, 바다를 통해 타국과 교류가 가능한 나라는 자원이 부족한 국가에겐 자원을 수급할 수 있는 통로가 되고 자원이 넘치는 나라에는 그 자원을 통해 배를 불릴 수 있는 통로가 된다. 사실 바다 보다는 항구가 중...

[알고리즘] 파이썬으로 Trie 구현하기(1)

이미지
 Trie는 이 구조를 구현한 라이브러리도 여럿있어서 파이썬으로 구현하기는 쉬울 것이다. 하지만 trie에 대해 더 잘 이해하고 연습도 할 겸 여기저기에서 참조해가며 직접 만들어 보았다. 이번에는 trie에 대한 간단한 개념과 문자열의 삽입과 조회 부분의 구현까지 진행할 것이다. 특징   Trie는 prefix tree라고도 불리는 트리 구조의 알고리즘이다. Trie는 다음과 같은 특징이 있다. 검색이 빠르고,  문자열을 키로하는 동적 집합이나 연관 배열로 사용되고  노드는 키를 갖지 않는 대신 노드의 위치가 키 역할을 하고  root가 빈 스트링이라는 특징이 있다. 시간 복잡도  시간 복잡도는 알고리즘의 수행시간 분석결과를 나타내는 용어이다. 당연히 시간 복잡도가 낮을수록 좋으며 연산 횟수를 계산하고, 처리해야 할 데이터의 수 n에 대한 연산횟수 함수 T(n)을 구성하여 구한다.  Trie의 시간 복잡도는 대표적인 트리 구조 중 하나인 이진 검색 트리(Binary Search Tree)와 비교를 해보도록 하겠다. 데이타 구조 시간 복잡도 (정수/실수) 이진 검색 트리 O(logN) 문자열 이진 검색 트리 O(MlogN) 트라이 O(M)   문자열은 길이가 변하기 때문에 검색 시간이 많이 소요된다. 길이가 고정된 정수나 실수는 O(logN)의 시간이 걸리지만 문자열은 길이가 변하기 떄문에 문자열의 최대 길이 M을 곱한 O(MlogN)이 된는데 trie는 이러한 문제를 해결하기 위해 고안된 자료구조이다. 트라이의 구조  알파벳만을 사용하여 trie를 구성할 경우 각 노드는 26개의 알파벳과 1개의 공백으로 구성된 27개의 포인터를 갖고있는 배열을 갖고 있다.   문자열 집합 : S = {"BE", "BET", "BUS", "TEA", "TEN"}을 trie로 구성한 그...

[Linux] Vim 설정

[펌글]보통 많은 사람들이 Vim 을 그대로 사용하지 않고 여러가지 설정을 해준다. root 계정을 사용하고 있다면 vi /root/.vimrc 를 쳐서 다음과 같은 내용을 입력해준다. (물론 원하는 것만)  여기서 " 는 주석으로 꼭 입력할 필요는 없습니 다.  set tabstop=2  "탭 간격을 2 칸 으로 지정한다 set shiftwidth=2 " >>나 << 사용시 들여쓰기 간격을 지정한다 set expandtab " 탭 문자를 공백문자로 변환한다.  set softtabstop=2 "탭 간격을 공백문자로 변환하면 두 칸 단위로 삭제한다  set visualbell " 사용자 실수 경고시 비프음 대산 화면을 한 번 반짝인다.  set nobackup "백업 파일을 생성하지 않는다 set cindent "C 언어 스타일의 들여쓰기를 사용합니다.  set autoindent "자동 들여쓰기를 사용합니다. set smartindent "좀 더 지능적인 들여쓰기를 사용합니다.  set enc=euc-kr "인코딩을 한글로 지정합니다.  set incsearch "키워드 입력시 검색하는 점진 검색을 사용합니다.  (파이어폭스서 사용) syntax on "구문 강조기능을 사용합니다 filetype on "파일 종류에 따라 구문을 강조합니다. set background=dark "배경색을 어두운 색으로 설정합니다. colorscheme evening "VI 색상 테마를 evening  으로 설정합니다 set backspace=eol,start,indent "줄의 끝, 시작, 들여쓰기서 백스페이스 사용시 이전 줄과 연결 set history=1000 " VI  편집 기록을 1000개 까지 저장합니다.  set hlsearch "검색어 강조 기능을 사용합니다.  set ig...

[책 리뷰] 글자 전쟁

이미지
 김진명 작가는 개인적으로 좋아하는 작가이다. 군 복무를 할 때 처음 김진명 작가의 책을 접했다. 제목이 기억은 안나지만(이래서 리뷰를 남겨야한다.) 굉장히 재밌게 읽었고 그 후부턴 김진명 작가의 책은 출간되었다는 소식을 접할 때 마다 항상 관심을 갖게되었고, 고구려도 4편까진가 읽어 봤다. 아직 독서 량이 많지 않은 내가 특정 작가의 책을 이만큼 읽었다는 것은 매우 드문경우이다.(나름 팬이라는 의미..)  김진명 작가가 쓰는 책은 뭔가 한국판 '다빈치 코드' 같다는 느낌을 읽을 때마다 받는다. 이게 소설인지 팩트인지 알 수 없는, 그래서 더 몰입하게 되는. 그래서 읽을 때 다른 책보다 더 숨막히는 느낌이 들고 뭔가 기록되지 않은 역사에 대해 알게 된 것 같은 성취감도 느껴진다고 해야하나... 아무튼 이책도 그런 느낌을 주는 책이었다 초반에는..  대략적인 줄거리는 주인공이 작중의 어떤 작가가 쓴 소설을 지키고 세상에 공표하는 내용이다. 근데 작중에 등장하는 작가는 왠지 김진명 작가 본인을 의미하는 듯한 느낌을 받았다. (마치 셜록에서 셜록의 친구 왓슨이 코난 도일인듯한 느낌인 것처럼) 어쩃든 작중에 등장하는 소설의 내용은 한자가 한족이 만든 글자가 아니라 우리의 조상들이 만든 글자라는 흔적을 지우는 것을 막기 위한 내용이다. 책 표지에 나오는 답(畓)이라는 글자는 참 쉬운 글자이다. 논은 밭에다 물을 채웠다는 의미인데 중국인들이 쓰는 한자에는 저 답이라는 글자가 없다고 한다. 뭐 이런저런이유로 '한자는 동이족이 만든 글자' 라는 주장을 하는 내용의 소설인데 이 소설을 집필하던 작가가 신변의 위협을 받던 중 주인공에게 소설이 담긴 usb를 전달하고 그날 밤에 암살을 당한다.(...) 주인공이 usb에 담긴 소설을 읽어가며 진실을 추적하는 내용인데, 소설도 중간에 갑자기 끝나고 책의 마무리도 뭔가 급 마무리를 지은듯한 느낌이 들어 용두사미 같다는 느낌이 많이 드는 실망스러운 책이었다. 마치 책에 등장하는 작가가 ...

[알고리즘] Suffix Tree

이미지
Suffix tree는 문자열의 모든 접미사들을 표현하는 trie 모양의 자료 구조이다. prefix tree라 불리는 trie가 근간이 되는 자료구조인듯 한데 두 자료구조의 차이는 banana라는 단어가 있을 때 trie는 banana라는 단어만 저장을 하지만 suffix tree는 banana, anana, nana, ana, na, a 와 같이 banana라는 단어에서 나올 수 있는 모든 경우의 수를 다 저장한다는 것이다. 쓸데없이 모든 경우를 저장하는 이유는 문자열에 대한 검색을 할 때 필요하기 때문이다. Trie 자료구조 같은 경우에는 ban, ba와 같은 일부분의 단어로 banana라는 완전한 단어를 찾을 수 있지만 nan, ana와 같은 단어로는 banana를 찾을 수 없다. 이러한 문제를 해결하기위해 trie를 개선시킨 것이 suffix tree인듯 하다.  Suffix trie는 trie에 모든 suffix들을 저장한 구조를 의미한다. 아래 그림은 abaaba라는 문자열 T를 suffix tree에 저장하는 예시이다. suffix tree나 suffix trie에 문자열을 저장할 때는 문자열의 끝에 $를 붙이는데 그 이유는 정확히 모르겠다... 아마 문자열의 끝을 알리기 위한 용도인 것 같다. Suffix Trie의 형태  위 그림의 왼쪽과 같은 모양이 suffix trie이다. 여기서 자식 노드가 1개 뿐인 것들을 합치면 오른쪽과 같은 모양이 되는데 저러한 형태의 자료구조를 suffix tree라 한다. Suffix Tree  이 suffix tree는 문자열의 길이만큼의 leaf node를 갖는다  위 그림에서 오른쪽 그림은 tree의 edge label을 (offset, length)의 형태로 T를 나타낸 것이다. Suffix tree의 label  각 노드의 label은 root로부터 node로 연결된 edge의 label과 ...

[Web] 자바스크립트로 다운로드 버튼 구현하기

코딩 연습겸 웹 개발..을 하기전에 보고 배운것부터 정리.. 먼저 다운로드 버튼 <button class="btn" type="submit">다운로드</button> button type을 submit으로 지정해주고 id를 download_btn으로 해준다. class는 신경안써도 될듯...? <script type="text/javascript"> var contextPath = '${contextPath}/'; $(document).ready(function(){ $("#download_btn").click(function() { download(); }); function download() { var url = contextPath + "다운로드 url 경로"; location.href=url; } </script>  버튼을 클릭하면 download() 함수를 호출하여 url을 통해 다운로드를 실행하면 완료. 쓰고 보니 아무것도 없이 딸랑 저것만 있으면 나중에 봤을때 나도 이해안될것 같다.. 그래도 정리안해놓는것보단 나을거라 생각하며...

[책 리뷰] 수학의 힘

이미지
 책 표지에 나와있는대로 수학에 상처받은 어른들을 위한 책이다. 수학이 필요하지만 수학에 대해 트라우마를 갖고 있어 선뜻 수학이 손에 잡히지 않는 사람들을 위한 책이라고 생각하면 될것 같다. 책 내용도 이러한 내용이나 공식들이 왜 필요한지 쉽게 설명해주고 두께도 얇은 편이어서 다시 수학을 공부해야하지만 겁을 먹고 있는 사람들에게 입문서로 좋다는 생각이 든다.   문제는 내가 수학에 대해 거부감이 없다는 점.. 수학을 좋아하는 편이라는 점이다. 책을 소장하는 것을 좋아해서 가급적이면 책을 사서 보는 편인데 이 책은 빌려보는 것이 더 현명하지 않았나 하는 생각이 든다. 수학에 두려움을 갖고 있는 사람에게 나눔이 가능할 정도..?