알고리즘이란?
알고리즘 Algorithm: 문제를 해결하기 위한 절차나 방법. 필자는 명령어들의 [유한집합]을 의미할 예정
유한집합이라는 유식해보이는 단어가 나왔다고 해서 당황할 것 없다. 그냥 [언젠가는 끝나는 작업]이어야 한다는 것이다. 그게 비록 수초가 걸리든 수분이 걸리든 수년이 걸리든 말이다. 언젠가 끝나기만 하면 된다. 왜 굳이 이러한 정의가 있는지는 애초에 왜 우리가 알고리즘이라는 단어를 만들어 사용하는가에 대해 생각해보면 된다.
알고리즘은 그저 어떠한 문제가 주어졌을 때 그걸 풀이하는 과정을 정리해놓은 쪽지라고 생각하면 된다. 우리가 게임을 클리어하기 위해 적어놓은 공략집도, 회사에서 업무를 배우고 나서 잊어버리지 않기 위해 적어놓은 쪽지도, 중학교 수학시간에 이차방정식을 풀기 위해 적용했던 인수분해와 근의공식도 모두 알고리즘이다. 그런데 이 알고리즘이 영원히 끝나지 않는 프로세스라면 어떨까? 공략집대로 따라해도 최종몹이 안 나오고, 회사에서 한번 배웠던 업무도 다시 하려니 끝날 기미가 안 보이고, 선생님이 가르쳐 준대로 이차방정식을 풀어도 답이 안 나온다. 재앙이다. 차라리 그런 공략집에 의지하느니 [내가 직접하는 게 빠를 것이다.]
[그러니 알고리즘은 언젠가는! 답이 나오는 절차여야 한다.]
그런데..!
알고리즘이 언젠가 답이 나오는 일련의 절차라고 한다면, 각각의 알고리즘은 성능을 평가할 수 있을 것이다. 어쩔 수 없이 성적이 나오는 수능에서 고득점자와 저득점자가 있을 수 밖에 없는 것처럼 말이다. 알고리즘의 효율성에 대해서 예시를 통해 살펴보자. 어젯밤 마라엽떡에 교촌허니콤보를 시원하게 땡기고 잔 희원이는 갑자기 아침에 일어나 뜬금없이 오늘부터는 식단을 해야겠다는 결심을 했다. 그래서 아침은 간단하게 바나나 하나로 때울 예정이다. 이 때 희원이의 머릿속에 떠오른 세가지 알고리즘 중 어떤 어떤 것이 가장 효율적일까?
- 집 인근 500m 거리 GS25에 들러 낱개 포장된 바나나를 1,500원에 구매한다.
- 바나나 나무를 키우기로 결심하고 필리핀 마닐라에 조그마한 땅을 사서 바나나 농장을 꾸린다.
- 에버랜드 원숭이에게 화폐의 가치에 대해 강의하고 바나나와 바꿔먹는다.
아무래도 첫번째 선택지일 것이다. 여러분이 두번째 세번째 선지를 골랐더라도 너무 낙심하지 말기 바란다. 희원이는 분명 다이어트에 성공한 바나나 대농장주가 되어있을지도 모르니까.
하지만 확실한 건, [비효율적]이라는 것이다.
우리는 종종 한두 사람의 비효율을 낭만이라고 치부하는 경향이 있다. 하지만 이 세상 모든 사람들이 1희원이 아닌 2희원이었더면 어떤 일이 벌어질까? 온 세상이 바나나 밭이 되고 말 것이다. 이게 바나나 사는 나라지 사람 사는 나라냐 하지만 우리는 그렇게 한가한 사람들은 아니다. 각자 하고 싶은 일이 있고, 해야할 일이 있다. 희원이가 바나나를 먹고 싶었기에 망정이지 방청소처럼 하기 싫은 일이었다면 비효율적으로 행동할 수록 괴로워지는 건 희원이 뿐이다… 따라서 우리는 이런 일의 비효율에 대해 조금이나마 효율적인 방법을 찾기 위해 잔머리를 굴릴 필요가 있다.
그래서 우리는 알고리즘을 공부한다.