안녕하세요. 이번 강좌는 알고리즘에 관한 강좌입니다! 중간에 자료 구조도 들어있습니다. 이 강좌는 모두 자바스크립트 코드로 짜여질 것이고요. 코드가 난해하기 때문에 이해해기 쉬우라고 주석이 많이 들어있습니다. F12를 눌러서 개발자 도구를 여시고, 콘솔 메뉴에서 알고리즘 코드를 복사 붙여넣기 해보세요! 결과를 바로 확인할 수 있습니다.
알고리즘
알고리즘이란 어떤 값을 입력받아 다른 값을 출력하는 계산 절차를 의미합니다. 간단하죠? 정의는 간단하지만, 실제로는 그렇지 않습니다... 예전에 순서도 그려보셨나요? 그 과정과 비슷합니다. 결과값을 만들기 위한 과정을 설명합니다.
알고리즘은 위의 정의처럼 출력값을 얻기 위한 절차이기 때문에 코딩을 해본 사람이라면 모두 경험해보았을 겁니다. 물론 이 강좌에서 다루는 알고리즘은 조금 복잡한 문제들입니다만 여러분들도 이미 알고리즘을 사용하여 코딩을 하고 있습니다. 겁먹을 필요는 없다는 거죠.
실생활에서도 알고리즘이 많이 사용됩니다. 인터넷에서 검색을 할 때, 검색 알고리즘이라는 말 많이 들어보셨죠? 어떻게 하면 검색어(입력값)으로부터 정확한 검색 결과(출력값)를 도출해낼 것인지 결정하는 과정입니다. 구글은 수십억 개의 문서들 중에 정확한 결과를 0.몇초만에 가져옵니다.
구글에 zerocho를 쳐보세요. 링크
외계인을 고문해서 얻은 기술인 걸까요? 어떻게 수백억 개의 데이터 중에 3만개의 검색 결과를 0.53초만에 찾을 수 있었을까요? 그것도 대충 찾은 게 아니라 상당한 정확도로 말이죠. 바로 엄청 정교하면서도 효율적인 알고리즘을 만든 겁니다.
다른 예로, 제 블로그에 사용된 SHA512 암호화(정확히는 해시 함수) 기법같은 것도 비밀번호(입력값)을 어떻게 암호(출력값)로 바꿀지 정하는 것이고요. 알고리즘은 생각보다 실생활에 밀접한 존재입니다.
대부분의 경우, 보통 사람들도 쉽게 문제 해결을 위한 알고리즘을 짤 수 있지만, 특정 상황에 가면 머리가 아파오기 시작합니다. 수백, 수천 개의 데이터를 어떻게 정렬할 것인지, n번째로 큰 수는 어떻게 찾을 것인지 등 사람이 직접 하면 간단한 것들도, 컴퓨터에게 시키려니 너무 어렵습니다. 이럴 때는 구글이나 네이버 지식인에 물어보곤 하죠. 이 강좌에서는 알아두고 있으면 편리한 알고리즘들을 소개할 겁니다.
알고리즘은 수학이 매우 중요합니다. 알고리즘을 분석할 때 수행시간을 주로 따지는 데, 그것을 계산할 때 수학이 사용됩니다. 그렇지만 이 강좌에서는 최대한 수학적인 것은 쉽게 설명해보도록 노력하겠습니다. 대학교 과정이라 정말 어렵습니다. 저도 수학 별 거 아니겠지하고 무시했다가 큰 코 다쳤던 기억이 나네요. 기존보다 더 효율적인 알고리즘을 찾아보세요. 만약 찾는다면 여러분에게 엄청난 명예를 안겨다줄 겁니다. 실제로 알고리즘 하나를 개발해내면 박사 학위정도는 그냥 받을 수 있습니다.
우리가 배울 알고리즘을 시각적으로 보여주는 유튜브 영상입니다. 멍하니 보기 좋습니다.
다음 시간부터 다양한 알고리즘들에 대해 알아보겠습니다! 첫 시간은 삽입 정렬입니다.