어떤 문제의 해결을 위하여, 입력된 자료를 토대로 하여 원하는 출력을 유도하여 내는 규칙의 집합. 여러 단계의 유한 집합으로 구성되는데, 각 단계는 하나 또는 그 이상의 연산을 필요로 한다. [출처: 표준국어대사전]
개인적으로 알고리즘을 다음과 같이 정의하고자 한다.
- 알고리즘은 어떤 문제를 해결하기 위한 연산(=process)의 집합이다.
- input(=문제) 값이 process(=알고리즘)를 거치면 output(=문제해결)이 생성된다.
▶ 여기서 생각해 볼 만한 것이 있다. 사전적 정의에서 알고리즘은 규칙의 집합이라고 했는데, 이를 단서로 유추해보면 알고리즘 내부에 또 다른 여러 알고리즘으로 구성될 수 있을 것으로 예상된다. 내부의 알고리즘들은 병렬 또는 직렬로 배치되어 설정된 계산을 수행해 나가지 않을까?
5주간 배움을 통해 적은 힘을 들여 더 많은 코드를 구현할 수 있는 능력을 배울 것이다.
생애 첫 번째 프로젝트를 수행(실시간 지하철 도착 확인 웹사이트 구현)하면서 코드가 비효율적이라는 점을 발견했다. 코드가 약 1000줄이 되어가는 모습을 보면서 다른 프로젝트를 하나 더 하기보다는 내실을 다져야 겠다는 생각을 했다. 동일한 프로젝트를 다시 했을 때 코드 줄(line) 수를 절반 정도로 줄여 효율적이고 효과적인 코딩의 필요성을 느낀 것이다. 이를 실현하기 위해서는 내가 원하는 방향으로 코딩을 할 수 있는 기본 지식이 필요했다.
이와 동시에, 코딩 테스트를 할 수 있는 기반을 다지기로 결정했다. 시간이 지남에 따라 코딩을 할 수 있는 사람은 증가할 것이고, 프로그래머를 구인하는 많은 회사는 적합한 사람을 채용하기 위해 코드 테스트를 도입할 것으로 예상했다. 적합한 사람이란 기본적으로 효율적인 코드를 구현해내는 사람일 것이고, 이는 알고리즘을 이해하고 있는 구직자라고 말할 수 있다. 왜냐면 회사는 적은 투입량으로 최대의 결과를 도출하는 대표적인 이윤집단이기 때문이다.
3자 입장에서 본다면 미래에 나도 구직자가 될 것이고, 그러한 사람들 틈에서 경쟁해야한다. 그러므로 알고리즘을 모르면 자연스럽게 도태될 것이다.
아직까지는 효율적인 또는 효과적인 코딩의 기준을 정의하기가 쉽지 않다. 하지만, 코드를 비교하면서 기준이 될 수 있는 항목을 언급하고자 한다.
코딩을 완료한 결과 가장 마지막 줄(line)의 숫자가 적다면 효율적으로 코딩을 했다고 말할 수 있을 것 같다. 이는 마치 몇 마디 하지 않았는데, 내가 말한대로 일이 척척 진행되는 것과 동일하다. 100마디 해서 10개 결과를 내는 것보다는 10마디 해서 10개 결과를 도출해낸다면 적은 힘을 들였다고 말할 수 있는 것과 같은 이치다.
반복하는 횟수가 적을 수록 효과적인 코딩을 했다고 말할 수 있다. 반복 횟수를 줄이면 계산하는 양과 시간도 줄어들기 때문이다. 이 상황을 예로 든다면, 10번 반복할 것을 5번 반복해 결과를 도출하는 것이다.
숫자의 크기 비교를 하기 위해서 모든 수를 비교하는 것이 아니라, 자신 옆에 있는 수와 비교한다면 반복하는 비교 횟수가 줄어들고, 계산하는 시간도 줄어들 수 있을 것이다.
하나의 문제를 해결하는데 있어서 다양한 해법이 존재한다. 점심 시간에 배를 채우는 문제를 해결하기 위해서 반드시 '라면'이라는 선택지만 존재하는 것이 아니다. 청국장, 돈가스, 김밥을 먹어 배를 채울 수 있다. 이처럼 문제 해결 방법은 다양하다.
다양한 알고리즘이 있다면 어떤 알고리즘을 선택해야 하는 것일까? 정답은 '일률적인 정답은 없지만 상황에 맞는 정답은 있다'일 것이다. 자신의 상황에 맞는 알고리즘을 선택 또는 구현하여 사용하면 된다. 효율적인 계산이 필요하다면 그에 맞는 알고리즘을 선택하면 되고, 조금 느리더라도 모든 계산이 필요하다면 그에 맞는 것을 사용하면 된다.
상황에 따라 알고리즘 사용이 결정된다면, 상황을 읽어내는 눈과 기준이 있어야 한다. 현재 어떤 문제가 있는지 정의하고, 어떤 요소의 개선이 필요한지 인지하는 능력이 필요한 것이다. 아직까지는 이러한 안목이 없는 것 같다. 연습이 필요하다.
생각을 코드로 변경하여 출력하는 능력을 향상시켜야 한다. 코드를 구현하기 전 전체적인 방향을 머리속으로 생각하거나 화면에 구현하기도 한다. 대체로, 전체적인 방향은 옳지만 이를 구현해내는데 상당히 많은 힘이 소비된다. 코드를 구현하던 중 다음 코드를 까먹어 다시 생각하는 횟수가 많다. 이를 가장 우선적으로 개선해야할 것으로 사료된다.
위에서 언급했듯이, 최적의 알고리즘 사용 능력은 상황 파악 능력에서 비롯된다. 현재의 문제가 무엇인지 파악하고 어떻게 개선해낼 것인지 생각하는 능력이 필요하다. 이 능력은 많은 프로젝트를 수행해보아야 증가할 것으로 예상된다. 일단, 본 개선점의 우선순위는 후순위다.