사람은 살아가면서 수많은 선택을 한다. 내가 오늘 점심메뉴를 어제와 동일하게 먹을 것인지, 아니면 바꿔서 조금 큰 걸음으로 서브웨이를 다녀올 것인지. 만약 내가 무언가를 선택해서 그렇게 행동했다면 결과는 바뀔 수 없게 된다. 내가 먹은 것은 비빔면
이니까 시간이 지나면 그렇게 남는다. 내가 한 선택은 그 당시 내가 추론했던 수많은 직관적인 생각을 지나 만들어진 결과이므로 현재에 와서 옳다 그르다 판단을 하는 것보다 당시의 선택은 최선이었다고 생각하는 것이 바람직하다.
알고리즘(Algorithm)이란 어떤 선택을 내리는 과정에 있어서 최적의 판단을 하기위한 선택에 대한 평가절차다. 일상적으로 사람들은 수많은 알고리즘을 거치며 살아간다. 다만 그 선택을 위한 평가절차는 눈에 보이지 않고 굉장히 빠르기 때문에 정확히 어떤 과정인지 설명하기가 어렵다. 가령 내가 힘든 일을 마치고 집에 와서 잠을 일찍자기로 결정했다고 가정해보자. 그 선택을 내리기까지 나는 수많은 고민과 생각
을 했을 것이다.
- 나는 오늘 평균 할당분보다 많은 양의 일을 했다.
- 나는 지금 평소보다 굉장히 피곤한 상태다.
- 퇴근하고 집에 도착할 시간이 되면 내가 무엇을 하기란 쉽지 않다.
- 퇴근하면 7시다. 7시에는 내가 좋아하는 TV프로그램이 방영된다.
- 하지만, 나중에 다시보면 되므로 피곤을 회복하는 것이 우선이다.
- 그래도 아쉬우니까 자기전에 1시간 정도는 유튜브나 넷플릭스를 볼까?
- 역시 귀찮다. 그냥 잠을 자야겠다.
- 씻어야 할까? 아니다. 내일 출근하기전에 씻으면 된다.
- 강아지와 산책해야하지 않을까? 괜찮다. 이번 주에는 5일이나 산책을 시켜줬다.
- 결정했다. 집에 도착하면 아무것도 안하고 침대에 누워서 잠든다.
사실 이것도 어떻게 보면 알고리즘이다. 내가 나의 상태를 일일히 파악해서 현재의 피곤함이라는 상태를 확정내렸고, 그러한 피곤함을 근거로 집에서 아무것도 하지 않고 자는 선택을 내렸다. 이게 최선의 선택이냐 최악의 선택이냐는 알 수 없지만 어떤 문제(잠을 잘 것인가?)에 대한 결정(답)을 내리기 위한 고민과정(알고리즘)은 여전히 존재한다.
어렵지 않게 접근하려고 하다보니 미사여구가 붙는다. 어찌됐던간, 일상에서의 알고리즘이라는 것은 일종의 선택을 위한 고민과정이다. 그럼 컴퓨터공학 분야에서의 알고리즘은 무엇일까? 단순히 정의를 내린다면 아래 사진으로 대체할 수 있을 것이다.
위는 라면을 끓이는 과정을 순서도로 나타낸 것이다. 중간 중간 조건들과 질문을 통해서 루프(Loop)구간이 생기고, 순차적으로 진행된다. 그냥 주욱 읽으면서 내려가면 마지막에 이 전체적인 순서도의 목적이 결과(Result)로 나와있고, 가장 위로 올라가면 어떤 결과를 위해 필요한 재료(Data)가 나와있다. 이걸 컴퓨터 공학에 적용한다면 어떤 값을 입력받아, 원하는 결과 값을 출력하는 계산 절차
가 된다. 결과값을 만들어 내기위한 절차를 기록해놓는 것이고, 이를 위한 최선의 방법을 찾아내는 것이 알고리즘이다.
복잡한 수식이 들어가게 되면, 비비디 바비디 부, 알고리즘이 완성된다. 좀더 컴퓨터 공학적이면서 일상에 가까운 예를 들어보자. 구글 검색창에 알고리즘이라고 치면, 수천 수만개가 넘는 페이지를 가지고 온다. 이 페이지들은 알고리즘
이라는 단어를 가지고 전체 수십억 개의 데이터 중 유사데이터를 가지고 오는 검색엔진 알고리즘으로 이루어져있다. 동일한 문자열이 포함되어있는지, 혹은 다른 데이터와 연관성이나 유사도가 어느정도 되는지를 판단해서 가지고 와서 우리 눈앞에 뿌려준다.
이렇듯 알고리즘은 선택을 위한 과정이다. 그런데 만약 위의 인터넷 웹에서 사용되는 알고리즘같은 것을 개발한다? 그건 불가능에 가깝다. 보통 수학을 전문적으로 연구하는 수학자들에 의해서 먼저 컨셉이 만들어지고, 이를 순차적인 방법으로 컨버팅해서 만들어내는 것이 프로그램 알고리즘이다. 뭔가 새로운 방식을 찾겠다는 것보다 어떤 결정을 내릴 때 가장 효과적인 알고리즘
그 자체를 개념화해서 이해하고 있어야한다.