알고리즘의 시작

by 둘리

'알고리즘'


이 단어를 떠올렸을 때 우리는 무엇을 떠올릴까? 아직 코딩에 전문가, 준전문가조차 발을 내딛지 못한 코딩 초보인 나에겐 아직도 머릿속에 유튜브 알고리즘이 가장 먼저 떠오른다. 다른 사람들도 아마 그렇지 않을까 조심스레 예상해본다. 하지만 아마 당연한 것이 아닐까 싶다. 요즘 검색도 유튜브로 하는 시대에 유튜브 알고리즘은 빼놓을 수 없는 워딩이라고 생각한다.


무언가를 연결짓고 관련된 것을 조합하여 사람들에게 제안하는 그 무언가. 따로 정의하기에는 애매한 듯, 그렇다고 도움은 명확한 그 어떠한 것. 그러한 알고리즘은 사람들에게 깊이 스며들어 있다. 하지만 코딩에서의 알고리즘은 우리가 알고 있는 것과는 사뭇 다르다. 아마 예상했던 정의와 조금은, 아니 어쩌면 많이 다를 수 있다.


코딩에서의 알고리즘은 문제를 해결하기 위한 명확한 절차나 방법을 의미한다. 이전 글에서 말했던 것처럼 알고리즘은 하나의 아이디어와 같은 것이다. 어떤 주어진 문제를 해결하는 데 있어서 명확하고 효율적으로 해결하기 위해 해결 절차를 구사하는 것, 그 아이디어 자체인 것이다.


예를 들어 우리는 버스를 타고 학교를 가야한다고 가정을 해보자. 그러기 위해선 먼저 우리는 집 밖을 나가야한다. 그리고 정류장으로가고 , 버스 번호를 확인하고, 버스에 타고, 요금을 지불하고, 학교 근처 정류장에서 하차한 뒤 마지막으로 학교까지 걸어가야한다. 이것이 알고리즘이다. 버스를 타고 학교를 가야한다는 문제상황에서 위와 같은 세세한 절차 방법이 알고리즘인 것이다.


이러한 알고리즘에서 생각해야할 중요한 4가지 요소가 있다. 먼저 정확성이다. 주어진 문제를 얼마나 정확하게 이해하고 이를 올바르게 해결했는 지이다. 그리고 효율성이다. 버스를 타러 가는 도중에 쓸 데 없는 절차가 껴있지는 않은 지 확인을 해야한다. 얼마나 효율적으로 문제를 해결했는지가 중요한 것이다. 세 번째는 명확성이다. 코딩을 짰을 때 다른 사람들이 쉽게 이해를 할 수 있는 지가 중요하다. 이는 업무 효율성과서 직결되기 때문이다. 마지막으론 재사용성이다. 이 문제를 제외하더라도 다른 상황에서 재사용할 수 있는 절차가 있는 지 확인하는 것도 업무적으로 좋다는 것이다.


하지만 결국 알고리즘에 있어서 제일 중요한 것은 얼마나 빠르고 효율적인지가 제일 중요하다. 흔히 이를 복잡도라고 표현을 하는데 코드를 실행하는 데 걸리는 시간 즉, 시간 복잡도와 메모리를 얼마나 차지하는 지의 공간 복잡도로 나뉜다. 이는 코드가 얼마나 효율적이고 단순하게 설계되어있는 지를 평가하기 때문에 알고리즘의 성능 평가에 중요하게 여겨진다. 이러한 과정을 통해서 성능을 비교하고 알고리즘 개선이 가능해지는 것이다.



코딩의 기본 구조


코딩의 기본구조는 입력 -> 처리 -> 출력으로 이루어진다. 한마디로 원하는 애들을 입력해주고 그 아이들을 다양한 행위를 통해 처리한 다음 결과를 출력하는 것이다. 기본적으로 입력, 출력, 함수 등이 있는데, 입력은 외부에서 주어진 값을 집어넣는 것이고 출력은 반대로 결과를 출력하는 행위이다. 그리고 함수는 코드 프로그램에서 제공하는 다양한 기능으로써 코드 안에서 다양한 행위를 가능하게끔 한다. 사실 더 깊게 설명할 수 있지만 알고리즘의 대략적 이해를 목표로 하기에는 이정도면 충분하다고 생각한다.


tempImagei0w3mI.heic


만약 위에서 예를 들었던 버스와 학교 문제를 코드 구조로 생각한다면 다음과 같은 것이다. 버스와 학교, 집, 정류장은 입력이 될 것이다. 왜냐하면 어떠한 행위에 기준이 되거나 그자체로서 의미하는 무언가가 있어야하기 때문이다. 이를 우리는 변수라고 부른다. 그 이후에 집에서 나와 버스를 타고 학교까지 가는 행위의 전반을 우리는 처리라는 과정을 통해서 이루어진다. 그리고 마지막 학교 도착이 출력이 될 것이다. 이것이 알고리즘인 것이다.


이렇게 알고리즘은 생각하는 것만큼 대단히 어렵거나 미묘한 존재가 아니다. 실상 나같은 경우에도 코딩을 배울 당시 알고리즘의 단어만 듣고 지레 겁을 먹었던 것도 사실이다. 하지만 문제를 푸는 아이디어, 과정이라고 생각하면 그리 어렵게 느껴지진 않을 것이다. 물론 실제론 코딩을 하는 건 어렵지만 복잡한 개념이 아니란 사실만을 기억해줬으면 하는 바램이다.






tempImage8rvc9Z.heic