저는 통계를 전공했습니다. 다른 말로, 프로그래밍을 제대로 배워 본 적이 없습니다.
대학 때 C programming수업을 듣기는 했지만 이후 쓸 기회가 없어서 다 잊어버렸습니다.
회사를 다니면서는 주로 SAS를 사용했습니다. 통계분석 기능을 활용한 적은 별로 없고, 주로 데이터 핸들링에 이용했지요. 잠깐 Python을 공부해서 써 보기도 했지만, 당장 주어진 일을 처리하는 데에는 언제나 Python의 (공부시간+코딩시간+실행시간)보다 SAS의 (코딩시간+실행시간)이 짧았기 때문에 Python에는 익숙해 지지가 않았습니다. (약간의 shell script와 섞어서) SAS로 웹크롤링도 하고, PageRank나 pLSI도 구현하고, 형태소 분석기 비슷한 것도 만들고, html문서도 만들고, 병렬처리도 하고, … 물론 아쉬운 점도 있었지만 10여년간 큰 문제 없이 지냈습니다.
어느날 하둡 세상을 만났습니다. 이전에는 1년치 로그 파일을 처리할 수 있는 사람이 회사에 "나"밖에 없었는데, 이젠 “누구나” 할 수 있게 되었습니다. SAS와 일반 파일 시스템에서 1주일 실행해야 할 작업의 결과가 하둡 기반에서 수시간만에 나오는 것도 봤고요. 세상이 바꼈으니 SAS를 버려야 할 때라고 생각했습니다. (SAS의 기본 모듈도 비싸지만, 하둡 위에서 돌아가는 SAS 모듈은 더~~ 비싸요)
데이터 핸들링/분석을 위해 매우 고차원의 프로그래밍 스킬이 필요하지는 않습니다. 하지만 ‘실수’가 적어야 하고, 어떤 구조체에 어떤 데이터가 어떤 형태로 들어가 있는지가 머릿속에 들어 있어야 합니다. 응용 프로그램과 달리 코드의 결과물을 기능으로 확인할 수 있는 것이 아니라서 숫자나 텍스트로 확인해야 하는데, 가장 좋은 것은 처음부터 실수가 하지 않는 것이죠. 결국 데이터 분석을 위한 프로그래밍 스킬이란 것은, ‘익숙함’이라고 할 수 있습니다. Python에 ‘익숙해 지기 위해서’ 무엇을 할까 생각하던 중에 Project Euler를 알게 되었고 문제를 풀어보기 시작했습니다.
Project Euler의 의도
위키피디아에 따르면, 단순히 답을 찾는 것 대신 어떻게 하면 가장 효율적으로 답을 찾을까를 고민하는 것이 이 프로젝트의 의도입니다. 예를 들어, 1000보다 작은 3이나 5의 배수를 찾기 위해 1부터 1000까지 숫자를 각각 3이나 5로 나눠보는 방법도 있지만, 그보다는 3의 배수 333개, 5의 배수 200개, 15의 배수 66개로부터 답을 계산해 내는 편이 좋다는 것입니다.
블로그의 의도
마침 데이터 분석을 위해 Python을 공부해야겠다는 분이 있어서 100번 문제까지 스터디를 진행하기로 했었습니다. 70번 정도까지 같이 코드를 보고 그만두게 되었지만, 직접 작성한 코드를 설명하거나 다른 사람의 코드를 보면서 생각이 정리되고 새로운 지식이나 기술을 익히는 것은 즐겁고 유익한 경험이었습니다. 글로 한 번 더 정리하면 나한테 도움이 되지 않을까, 누군가가 코멘트를 달아주면 그것 또한 나에게 도움이 되지 않을까.. 라는 생각으로 블로그를 개설합니다.
이 블로그는 혼자 하는 ‘스터디 모임’입니다. 누구든 조인할 수 있지만, 중학교 수준의 수학은 충분히 이해하고, 고등학교 수준의 수학도 웬만큼 따라갈 수 있는 분을 염두에 두고 쓴다는 점을 미리 밝힙니다.
문제 푸는 요령
대부분의 문제는 ‘1000만 이하의~’, ‘가로세로 200 이하의~’, ‘~~조건을 만족하는 100만번째~~’ 이런 식입니다. 숫자를 10분의 1로 낮추면 비효율적인(brute-force라고 부르는) 방법으로 쉽게 코딩해서 결과를 볼 수 있는 문제들이죠.
- brute-force로 1/10의 결과를 본다.
- 알고리즘을 개선한다. 이 때 1의 결과와 같은 결과가 나오는지 항상 체크한다.
- 전체 결과에 적용한다.
함께 스터디하실 분들은 반드시 위의 과정으로 문제를 푸셨으면 합니다. (문제를 만만히 보고 1을 건너 뛰었다가 버린 시간이 얼마인지.. ㅠ)
문제를 푼 다음
이곳의 문제들은 푸는 방법이 여러가지입니다. 문제별 게시판에 들어가서 다른 사람들이 어떤 아이디어로 어떻게 구현했는지 살펴보면 많은 도움이 될 겁니다. 문제별로 처음 100개, 최근 100개의 글이 남아 있고 나머지는 사라집니다. 추천 5개 이상 받으면 시간이 지나도 사라지지 않는다고 하는데, 시간 지나면 묻히는 게시판에서 추천 5개 받는 건 불가능하죠. 제 경우에는 게시판의 처음 서너페이지, 마지막 서너페이지를 보면서 알고리즘이나 파이썬 코드를 살펴봅니다. 그냥 답만 찾고 넘어가는 건 공부에 도움이 되지 않아요!
문제를 푼 다음
이곳의 문제들은 푸는 방법이 여러가지입니다. 문제별 게시판에 들어가서 다른 사람들이 어떤 아이디어로 어떻게 구현했는지 살펴보면 많은 도움이 될 겁니다. 문제별로 처음 100개, 최근 100개의 글이 남아 있고 나머지는 사라집니다. 추천 5개 이상 받으면 시간이 지나도 사라지지 않는다고 하는데, 시간 지나면 묻히는 게시판에서 추천 5개 받는 건 불가능하죠. 제 경우에는 게시판의 처음 서너페이지, 마지막 서너페이지를 보면서 알고리즘이나 파이썬 코드를 살펴봅니다. 그냥 답만 찾고 넘어가는 건 공부에 도움이 되지 않아요!
그럼.. let's start!
2 comments:
프로젝트 오일러를 푸는 사람들이 모여있는 밴드인데 관심있으면 들어와서 같이 의견도 나누고 같이 문제 풀어나가요.
http://band.naver.com/n/GDt0sMeb
Post a Comment