알고리즘 학습자료.pdf

들어가기 전에

우리는 이제 컴퓨터에 정보를 입력하는 방식을 배웠다. 그렇다면 이 정보를 컴퓨터는 어떻게 가공하여 출력하는 것일까?

우리가 일상 생활에서 다양한 문제를 처리하는 방식 처럼, 컴퓨터 또한 순서대로 필요한 동작을 하며 문제를 처리한다. 이를 알고리즘이라고 하는데, 알고리즘은 어떻게 정의할 수 있고, 그 정확성과 효율성은 어떨까?

#알고리즘 #의사코드

알고리즘

우리는 숫자, 글자, 색깔 등을 컴퓨터가 이해할 수 있는 2진법으로 표현한 것을 배웠다. 이 것은 **입력(input)**에 해당한다.

이제는 출력(output)에 대해 이야기 해보자. 그럼 어떻게 입력(input)에서 출력(output)을 얻을 수 있을까?

컴퓨팅은 입력을 받아 그 입력을 처리한 후 출력하는 과정이다. 알고리즘은 입력(input)에서 받은 자료를 출력(output)형태로 만드는 처리 과정을 뜻한다.

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/2f9e5eb4-c460-4a66-8855-711f02556a67/_2020-12-17__11.15.16.png

즉, 알고리즘이란 입력값을 출력값의 형태로 바꾸기 위해 어떤 명령들이 수행되어야 하는지에 대한 규칙들의 순서적 나열이다. (어려운 용어가 나오지만 억지로 이해하기 보다 우선 넘어간 후 아래의 예시로 이해하자)

이러한 일련의 순서적 규칙들을 어떻게 나열하는지에 따라 알고리즘의 종류가 달라진다. 같은 출력값이라도 알고리즘에 따라 출력을 하기까지의 시간이 다를 수 있는 것이다.

정확한 알고리즘

예를 들어, 전화번호부에서 Mike Smith를 찾는 일을 한다고 했을 때, 전화번호부를 집어들고 첫 페이지를 펼친 후 Mike Smith가 그 페이지에 있는지 찾는다. 없으면 그 다음 페이지에서 찾는다. Mike Smith를 찾을 때까지 혹은 전화번호부가 끝날 때까지 이것을 반복한다. 하지만 언젠가는 Mike Smith가 전화번호부에 있다면 이 알고리즘을 통해 Mike Smith를 찾을 수 있을 것이다.

알고리즘을 평가할 때는 정확성도 중요하지만, 효율성도 중요하다.

효율성은 작업을 완료하기까지 얼마나 시간과 노력을 덜 들일 수 있는지에 대한 것이다. 한 번에 한 페이지씩 보는 알고리즘은 정확하지만, 매우 오래 걸리고 비효율적인 알고리즘일 것이다. 한 번에 두 페이지를 넘기게끔하여 알고리즘을 개선한다면 어떨까? 이 알고리즘을 사용한다면 Mike Smith가 있는 페이지가 그냥 넘어갈 수도 있으니 주의해야 한다. 이럴 때는 이전 페이지를 확인하면 되지만 이 알고리즘 마저도 이 문제를 해결하기에 가장 효율적인 방법은 아니다.

정확하고 효율적인 알고리즘

"대부분의 경우 문제 해결은 단지 우리가 이미 가지고 있는 직관이나 생각들을 기계나 다른 사람들이 이해할 수 있는 방식으로 번역하는 것에 불과하다."

이번에는 더 직관적이고 효율적인 알고리즘을 적용해 Mike Smith를 찾아보자. 먼저, 전화번호부 가운데를 편다. 만약 Mike Smith가 그 페이지에 있다면 우리의 알고리즘은 끝난다. 없다면, 전화번호부가 이름순으로 정렬되어 있으므로 우리는 Mike Smith가 지금 페이지보다 앞 부분에 있는지 뒷 부분에 있는지 알고 있다. 그러므로 책의 절반을 버릴 수 있게 되고, 나머지 절반에 대해 똑같은 알고리즘을 수행한다. 한 페이지가 남을 때까지 계속 수행한다.

마지막에 남은 한 페이지에는 Mike Smith의 이름이 있거나 없거나 둘 중 하나일 것이다. 이 알고리즘은 기존 알고리즘 보다 더 효율적이다.