2008.05.05 22:15

자료구조 및 알고리즘 배우는 방법

알고리즘 학습은 프로그래밍에서 논리적 사고를 하기 위한 훈련입니다. 암기하는 것이 아닙니다. 수학 공식을 암기한다고 해서 수학의 문제 푸는 능력이 향상되는 것이 아닌것과 같습니다. 물론 수학 공식을 암기할 필요는 분명히 있습니다.

알고리즘도 동일하게 생각하시면 됩니다. 정렬, 검색, 그래프 등 다양한 알고리즘이 이미 소개되어 있습니다. 이러한 기본적인 알고리즘을 암기할 필요가 있습니다. 하지만 암기로만 그쳐서는 프로그래밍에서 요구하는 논리적 사고의 훈련이 되지 않습니다.

알고리즘 학습을 랭귀지 배우듯이 책을 보고 이해하는 것으로 알고리즘 학습을 생각하시면 도움이 되지 않습니다. 알고리즘에 대해서 책들을 소개하는 경우를 보면 c배우고 api배우고 이렇게 언어 학습의 한 과정으로 이러한 책을 보라고 권하는데 이것은 피해야할 방법입니다.

알고리즘 학습은 일반적인 프로그래밍 스킬을 익히는 과정과는 별개로 생각하시고 학습하셔야 합니다.

윈도우 프로그래밍이라면 C -> C++, API -> MFC 이렇게 학습하시면 되고요. API를 하지 않고 들어가도 할 수도 있지만 API를 학습하시고 하면 MFC가 수월합니다.

이러한 흐름과는 별개로 논리적인 사고훈련을 하는 것이 알고리즘입니다. C와 C++을 공부하시고서 이러한 언어를 도구로 이용해서 알고리즘을 학습하시면 됩니다.

우선 기본적인 알고리즘의 원리를 이해하고 C/C++로 코딩 훈련을 할 수 있는 책을 선택하세요. "알고리즘이 보이는 그림책/성안당" 이 책이 비교적 초보용으로 소개를 잘하는 것 같습니다.

이 책을 보신 후에는 이산수학을 고등학교 과정 수준에서 먼저 한번 정리를 해보세요. 이산수학이 알고리즘에서 다루는 이론적 바탕이 되기에 대학과정의 이산수학보다는 가볍게 볼 수 있는 고등학교에서 사용하는 이산수학을 한 번 보세요.

이 정도면 이제 혼자서 본격적으로 알고리즘 학습을 할 수 있는 준비는 갖추신 것입니다. 이 후에 추천할 만한 책은 "알고리즘 트레이닝 북 / 한빛미디어"을 보세요.

이 책은 국제정보올림피아드, 국제 대학생 프로그래밍 경시 대회, 탑코더 경시 대회 등에서 나온 문제를 분야별로 정리해 놓은 책입니다. 원서를 번역한 책인데 원서에는 없는 해답지가 붙어있습니다. 해답을 보시지 말고 혼자 프로그래밍을 해보시고 이것을 역자들의 해답과 비교를 하시는 방향으로 공부하세요. 이 때 본인의 코드를 이 책의 웹사이트에 제출하시면 코드에 대한 평가도 해줍니다.

우리나라의 http://www.koi4u.net/ 이 사이트는 한국올림피아드에 나온 자료를 풀어보는 사이트입니다. 함께 참조해보세요.

이 정도 보셨으면 "C로 배우는 알고리즘 / 이재규"의 책을 보세요. 알고리즘을 공부할 때 바로 이 책부터 보는 것은 비추입니다. 이 책을 보시는 상당수의 학생들이 책에 나오는 코드를 이해하는 수준에서 접근을 합니다. 이것은 알로리즘 훈련이 되지 않습니다. 스택, 리스트, 트리 등이 무엇인지는 알 수 있지만 저자의 코드가 나오기에 책을 보는 사람의 사고를 저자의 생각으로 획일화시키는 단점이 있습니다. 책의 내용은 분명히 훌륭합니다. 단지 이 책은 앞에 설명한 훈련과정을 거치시고 보시되 저자의 코드를 바로 보시지 마시고 본인의 코드를 먼저 작성하시고 비교하시는 차원에서 보시면 좋습니다. 이 책은 1권과 2권이 있는데 1권은 공통적인 알고리즘에 대한 소개이고 2권은 보안이나 영상처리, 데이터베이스 등 전문 분야에서 사용되는 알로리즘에 대한 소개서 정도입니다. 2권은 보시는 이후에 각 분야별로 필요하신 알고리즘을 공부하실 때 참고하시는 정도로 사용하시면 됩니다.

여기까지면 알고리즘에 대해서 어느 정도 공부를 하시게 된 것입니다. 그러나 알고리즘이 여기서 끝이 아닙니다. 이제는 게임분야, 보안분야, 영상처리 분야, 데이터베이스 등 본인이 관심을 가지게 되는 분야의 알고리즘을 공부하셔야 합니다. 이러한 알고리즘은 전문적인 분야이다 보니 수학 등의 배경 지식을 요구합니다.

대학에서 배우는 과목인 이산수학, 수치해석이 있습니다. 이러한 지식이 알고리즘 구성에 많은 도움이 됩니다. 그래픽 프로그램을 하나로 예를 들면 그래픽 처리와 관련된 라이브러리를 사용하는 수준이 아니라 라이브러리를 개발해야 하는 일이 실무에 나오시면 필요하게 됩니다. 이 때 곡선 하나 그리는 알고리즘 하나로 학회에 논문을 제출할 정도입니다. 포토샵이나 오토캐드 등 이러한 프로그램 뒤에는 이러한 알고리즘이 뒤에 있습니다. 이러한 알고리즘에는 미적분학, 선형 대수, 확률/통계 등 수학적 지식이 있어야 직접 알고리즘을 만들 수는 없어도 외국에서 나온 이러한 알고리즘을 이해하고 자신의 프로젝트에 적용을 할 수 있습니다. 수학과에서 배우는 수학 전반에 대한 지식이 프로그래밍에서 필요한 것은 아닙니다. 나중에 게임이던, 그래픽처리던 어떤 분야를 하시게 되었을 때 해당 분야에서 주로 사용하는 알고리즘을 이해하고 사용하시기 위해서는 이산수학, 수치해석 등의 대학에서 강의되는 수학에 대한 기본 지식은 갖추어 두셔야 합니다.

알고리즘 공부는 C->C++->WinAPI->MFC 등 이렇게 공부하는 흐름과는 별개의 흐름입니다. 프로그래머가 이러한 기술적인 내용에 대한 지식도 필요하지만 한편으로는 알고리즘과 수학에 대한 소양도 지녀야 나중에 실무에 오셔서 제대로 자리를 잡을 수 있습니다.

추가할 것은 위와 다른 흐름이 하나 더 있습니다. 그것은 C++ 등 객체지향 프로그래밍과 관련된 분야입니다. 클래스 설계와 관련된 분야인데 C++을 지금 문법을 위주로 공부하실텐데 이것으로 C++이 끝나는게 아니고 클래스 디자인과 관련하여 디자인패턴, 리팩토링, UML 이런 분야를 지속적으로 공부하셔야 합니다.

한 분야만으로 이렇게 깊게 공부하시는 것이 필요합니다. 절대 깊이 없이 자바, c# 등 언어를 배우시는데 힘을 쏟지 마시고 C++을 배우시고 있으니깐 이 언어를 기반으로 api, mfc 등의 흐름과 클래스 디자인 흐름, 알고리즘 흐름 등 세 분야를 적절히 조화하셔서 계속 공부를 하세요. 한 언어에서 배운 개념적 지식은 얼마든지 다른 언어를 배우실 때 이용가능합니다.

알고리즘은 위에 우리나라 책만 소개를 했지만 영어가 되시면 좋은 책들이 많이 있습니다. 훌륭한 프로그래머가 되시기를 기원합니다.

원본 주소 : http://kin.naver.com/db/detail.php?d1id=1&dir_id=10104&eid=9biZt6g/7Rcoq3L3b6WG5MvH31hky8ix&qb=vsuw7biuwfIgwNq34bG4wbYgvu62sg==

Trackback 0 Comment 0