우리는 이제 컴퓨터에 정보를 입력하는 방식을 배웠다. 그렇다면 이 정보를 컴퓨터는 어떻게 가공하여 출력하는 것일까?
우리가 일상 생활에서 다양한 문제를 처리하는 방식 처럼, 컴퓨터 또한 순서대로 필요한 동작을 하며 문제를 처리한다. 이를 알고리즘이라고 하는데, 알고리즘은 어떻게 정의할 수 있고, 그 정확성과 효율성은 어떨까?
#알고리즘 #의사코드
우리는 숫자, 글자, 색깔 등을 컴퓨터가 이해할 수 있는 2진법으로 표현한 것을 배웠다. 이 것은 **입력(input)**에 해당한다.
이제는 출력(output)에 대해 이야기 해보자. 그럼 어떻게 입력(input)에서 출력(output)을 얻을 수 있을까?
컴퓨팅은 입력을 받아 그 입력을 처리한 후 출력하는 과정이다. 알고리즘은 입력(input)에서 받은 자료를 출력(output)형태로 만드는 처리 과정을 뜻한다.
즉, 알고리즘이란 입력값을 출력값의 형태로 바꾸기 위해 어떤 명령들이 수행되어야 하는지에 대한 규칙들의 순서적 나열이다. (어려운 용어가 나오지만 억지로 이해하기 보다 우선 넘어간 후 아래의 예시로 이해하자)
이러한 일련의 순서적 규칙들을 어떻게 나열하는지에 따라 알고리즘의 종류가 달라진다. 같은 출력값이라도 알고리즘에 따라 출력을 하기까지의 시간이 다를 수 있는 것이다.
예를 들어, 전화번호부에서 Mike Smith를 찾는 일을 한다고 했을 때, 전화번호부를 집어들고 첫 페이지를 펼친 후 Mike Smith가 그 페이지에 있는지 찾는다. 없으면 그 다음 페이지에서 찾는다. Mike Smith를 찾을 때까지 혹은 전화번호부가 끝날 때까지 이것을 반복한다. 하지만 언젠가는 Mike Smith가 전화번호부에 있다면 이 알고리즘을 통해 Mike Smith를 찾을 수 있을 것이다.
알고리즘을 평가할 때는 정확성도 중요하지만, 효율성도 중요하다.
효율성은 작업을 완료하기까지 얼마나 시간과 노력을 덜 들일 수 있는지에 대한 것이다. 한 번에 한 페이지씩 보는 알고리즘은 정확하지만, 매우 오래 걸리고 비효율적인 알고리즘일 것이다. 한 번에 두 페이지를 넘기게끔하여 알고리즘을 개선한다면 어떨까? 이 알고리즘을 사용한다면 Mike Smith가 있는 페이지가 그냥 넘어갈 수도 있으니 주의해야 한다. 이럴 때는 이전 페이지를 확인하면 되지만 이 알고리즘 마저도 이 문제를 해결하기에 가장 효율적인 방법은 아니다.
"대부분의 경우 문제 해결은 단지 우리가 이미 가지고 있는 직관이나 생각들을 기계나 다른 사람들이 이해할 수 있는 방식으로 번역하는 것에 불과하다."
이번에는 더 직관적이고 효율적인 알고리즘을 적용해 Mike Smith를 찾아보자. 먼저, 전화번호부 가운데를 편다. 만약 Mike Smith가 그 페이지에 있다면 우리의 알고리즘은 끝난다. 없다면, 전화번호부가 이름순으로 정렬되어 있으므로 우리는 Mike Smith가 지금 페이지보다 앞 부분에 있는지 뒷 부분에 있는지 알고 있다. 그러므로 책의 절반을 버릴 수 있게 되고, 나머지 절반에 대해 똑같은 알고리즘을 수행한다. 한 페이지가 남을 때까지 계속 수행한다.
마지막에 남은 한 페이지에는 Mike Smith의 이름이 있거나 없거나 둘 중 하나일 것이다. 이 알고리즘은 기존 알고리즘 보다 더 효율적이다.