본문 바로가기
jisung's 책읽기/기술서

알고리즘 문제해결 전략 - 어떻게 문제를 해결 할 것인가?

by jisungStory 2019. 1. 29.
반응형


알고리즘 문제해결 전략

어떻게 문제를 해결할 것인가?

 저는 학창시절 수학을 못하는 학생이었습니다. 저를 가르쳤던 많은 선생님들은 이과 보다는 문과를 추천하셨고 저는 그런 주변 사람들의 반응이 싫었습니다. 수학을 어떻게 하면 잘하는지 가르쳐 주기 보다 '너는 원래 그런 아이야' 라고 단정짓는 듯한 그들의 태도에 화가 났습니다. 그래서 저는 수학을 더 공부하고 잘하려고 노력했습니다. 하지만 현실의 벽은 언제나 그렇듯이 높고 험준했습니다. 수학을 어느 정도 이해할 수 있을 정도가 되자 저는 학교를 졸업했습니다. 그리고 대학이란 곳을 갔습니다. 저는 대학에서 비로소 고등학교 때 배웠던 수학들을 이해할 수 있었습니다. 왜 그때는 이해하지 못했던 것들이 대학에 와서야 이해 할 수 있었던 걸까요? 그것은 아마도 시간이지 않을까 합니다. 정규교육과정이라고 불리우는 중 고등학교 시절에는 학생들에게 어떤 주제에 대해 충분히 이해할 시간을 주기 보다는 빠른 시간 내에 많은 지식들을 외우게 하는데 목적을 두고 가르치고 있습니다. 그런 교육을 받다 보니 학문에 대한 충분한 이해가 생기기 전에 다른 지식들을 배우게되고 저 같이 명석하지 않은 학생들은 이해도 하기 전에 다음으로 넘어가게 되고 결국은 그 과목에 대한 흥미도 떨어지게 되는 것 입니다. 

 저는 좀 특이한 학생이었습니다. 가르쳐 주고 외우라고 하는 과목들 보다 내가 하고 싶은 과목들을 공부하는 것이 더 즐겁고 성취도도 높았습니다. 결국 주변의 추천에도 불구 하고 저는 공대를 선택했습니다. 왠지 그때는 잘 모르면서도 공대를 가면 과학자들이 하는 그런 실험들이나 미지의 컴퓨터 기술들을 막 배울 수 있을 거라고 생각했습니다. 물론 현실은 또 순수한 제가 상상했던 것과는 달랐고 원하는 지식들을 충분히 습득하기도 전에 대학 마저도 졸업해 버렸습니다. 그리고 결국 저에게는 꿈과 욕심만 남은 평범한 회사 생활만 계속될 뿐이었습니다. 

 하지만 꿈을 꾼다는 것은 그 것 만으로 설레이게 하는 힘이 있습니다. 저는 아직도 제가 소프트웨어 엔지니어로 일하는 꿈을 갖고 있습니다. 그래서 꾸준히 공부하고 또 공부하고 있습니다. 나이가 많아 이제는 신입으로 어느 회사에서 일하기에는 늦은 나이가 되어 버렸지만 혼자서 프로그램을 만들고 만들어진 앱들이 작동하는 것을 보는 것이 너무나 재미있습니다. 단순히 취미 수준에서 프로그램을 만드는 것에는 별 문제가 없지만 더 고도화된 프로그램을 만드려고 시도 할때마다 걸리는 것이 있습니다. 바로 프로그램의 효율성입니다. 

 프로그램은 극도록 논리적인 글쓰기를 요구합니다. 컴퓨터는 바보이기 때문에 제가 시키는 대로만 동작할 뿐 스스로 생각해서 문제를 해결해 내지 못합니다. 예전의 기계식 컴퓨터만 있을때는 명령어도 별거 없고 해서 프로그램을 만드는 것이 그렇게 까지 복잡하지는 않았지만 점점 컴퓨터는 인간이 상상하는 이상으로 발전했고 그 발전에 따라 명령어도 기하급수 적으로 많아 졌습니다. 결국 인간이 이해하지 못하는 수준까지 도달하자 몇몇 과학자들은 인간이 이해할 수 있는 컴퓨터 언어를 만들어 내기 시작했고 현재에는 수 많은 언어들이 다양한 목적에 맞게 활용되고 있습니다. 

 다행히도 저는 현대에 수 많은 과학자들이 만들어 놓은 언어를 편리하게 활용해서 프로그램을 만드는 입장이긴 합니다 만... 제 프로그램에는 문제가 있습니다. 그것은 바로 효율성 입니다. 

 생각나는대로 프로그램을 만들다 보면 어딘가에서는 버그가 발생하게 되어있고 그 버그를 해결하기 위해 고군분투 하다 보면 또 다른 곳에서 에러가 발생하는 것을 매번 경험합니다. 대부분 별것아닌 경우가 많지만 때로는 어디서 부터 잘못되었는지 문제를 찾지 못하는 경우도 많이 있습니다. 어떨때는 프로젝트 자체를 포기하고 새로 만든적도 있습니다. 제출 기간을 얼마 남기지 않고 버그가 발생해서 밤새 문제를 수정해서 다시 보냈던 경험은 아직도 제 등골을 서늘하게 합니다. 그때 부터 저는 알고리즘을 공부 해야 겠다고 마음 먹었습니다. 


어떤 작업이 주어졌을때 컴퓨터가 이 작업을 해결하는 방법을 가리켜 

알고리즘(algorithm) 이라고 합니다. 

p.88


 결국 알고리즘은 문제 해결 방법을 통칭하는 단어입니다. 저는 알고리즘을 순서도라고 후려쳐서 이해하고 있습니다. 문제를 해결하기 위해서는 결국 한단계씩 해결방법을 찾아 나가야 하고 그 각단계를 도식화하여 보기 쉽게 만들어 놓은 것이 순서도 이기 때문입니다. 이 책은 프로그래밍 대회에서 내공을 쌓은 저자 구종만 씨께서 그간의 경험을 책으로 엮은 것입니다. C++ 기반으로 쓰여져 있고 다양한 문제 해결 방법론에 대해서 두권에 걸쳐 설명하고 있습니다. 

 웬만한 전공서적 보다 두꺼운 책으로 알고리즘을 공부하고자 하는 한국의 소프트웨어 개발자들에게 이만한 책이 또 있을까 싶을 정도로 잘 설명되어 있습니다. 저는 이 책에서 문제 해결의 방법들을 배우고자 합니다. 그리고 이 책에서 제시하는 문제 해결 과정을 설명하는 저자의 담담한 문장을 통해 문제 해결이 주는 희열을 얻기 위해 노력하고 있는 모습을 엿볼 수 있었습니다. 

 저자가 제시 하는 문제 해결 과정은 다음과 같습니다. 


1. 문제를 읽고 이해하기

2. 문제를 익숙한 용어로 재정의 한다. 

3. 어떻게 해결할지 계획을 세운다.

4. 계획을 검증한다.

5.프로그램으로 구현한다.

6.어떻게 풀었는지 돌아보고, 개선할 방법이 있는지 찾아 본다. 

p. 23


 단순히 프로그램의 문제가 아니라 세상의 다른 복잡한 문제들도 위와 같은 과정을 거쳐 해답을 찾아 냅니다. 그리고 완벽한 정답이라는 것이 사실 없다는 것도 이제 우리는 잘 알고 있습니다. 좀 더 나은 정답을 찾기 위해 계속해서 노력하는 것이 어쩌면 우리가 남은 삶동안 취해야 하는 자세가 아닌가 합니다. 

 저는 이 책을 한번만 읽는 것은 부족하다고 생각합니다. 전공서적 만큼 혹은 그보다 더 어렵고 고차원적인 내용을 담고 있고 더군다나 제가 잘 모르는 C++ 를 주 언어로 사용하고 있어 추가 공부도 더 필요하기 때문입니다. 어쩌면 저는 책을 잘못골랐는지도 모르겠습니다. 하지만 이 책의 마지막 장을 읽는 순간 아마 지금 보다는 한걸음 더 나아간 소프트웨어 엔지니어가 되어 있지 않을까 상상해 봅니다. 

 문제 해결에 대한 새로운 장을 열어줄 "알고리즘 문제해결 전략" 이었습니다. 


2018/09/11 - [하루 책읽기/하루 기술서] - 그림으로 개념을 이해하는 알고리즘 #2

2018/08/24 - [하루 책읽기/하루 기술서] - 그림으로 개념을 이해하는 알고리즘


반응형

댓글