알고리즘이란 어떤 문제를 해결하기 위한 절차나 방법을 말합니다.
꼭 컴퓨터 세계에서만 쓰이는 단어는 아닙니다.
수학을 포기한 학생이 수학 시험 답안을 적을 때
12345라는 일정한 패턴을 쓴다면 이것도 알고리즘이라고 할 수 있습니다.
컴퓨터는 사람들의 반복적인 일을 빠르고 정확하게 처리해줍니다.
이렇게 블로그에 글자를 입력하는 것도
사람이 어떤 자판을 눌렀을 때 바로 화면에 그려준다는 점에서,
이 입력과 출력 사이에 컴퓨터 내부적으로 동일한 패턴이 이뤄진다는 점에서
알고리즘이라고 할 수 있습니다.
이 단순한 입출력 말고도 컴퓨터의 모든 부분이 알고리즘으로 되어 있습니다.
때문에 컴퓨터를 다루는 개발자가 되기로 마음먹었다면 알고리즘은 반드시 공부해야 합니다.
그러면 이 알고리즘은 어떻게 해야 잘할 수 있을까요?
우선 당연한 것부터 집고 넘어가겠습니다.
많이 해보는 것이 정답입니다.
저절로 필요한 능력들을 배울 수 있기 때문입니다.
충분한 노력을 한다는 가정 하에 좋은 방법을 써야 효율적이니
제가 생각하는 알고리즘을 좀 더 잘 할 수 있는 방법에 대해서 끄적여 보겠습니다.
생각부터 해야 한다
개발에 입문하면서 먼저 접하는 쉬운 알고리즘 문제는
오래 생각하지 않아도 쉽게 해결되는 경우가 많습니다.
복잡한 논리를 구현하기보다는 알고리즘 자체에 익숙해지는 데 목적이 있기 때문입니다.
그러나 문제의 난이도가 올라갈수록 바로 접근하는 게 불가능해집니다.
사실 알고리즘에서 코드를 짜는 부분은 알고리즘을 구현하는 수단일 뿐이지
알고리즘을 어떻게 만들 것인지는 사람의 생각에서 나옵니다.
논리만 명확하다면 그 다음은 이를 코드로 옮기면 될 뿐입니다.
때문에 곧장 코딩하려 달려들지 말고 논리를 먼저 생각해야 합니다.
주석을 이용해서 수도 코드를 작성해보거나
노트에 어떤 식으로 구현해 볼 것인지 미리 적어보는 게 큰 도움이 됩니다.
다양한 알고리즘에 대해 공부해야 한다
안타깝게도 생각만 잘 한다고 해서 알고리즘이 해결되는 것은 아닙니다.
모든 학문이 그렇듯이 어느 정도의 공부가 필요합니다.
알고리즘을 적용하는 데에도 패턴이 있고
선행 지식이 있다면 각 패턴에 해당하는 문제를 만났을 때 더 쉽게 해결할 수 있습니다.
예를 들어 1, 2, 3이라는 숫자를 이용해서
만들 수 있는 모든 숫자를 만든다고 할 때 언뜻 감이 안 올 수 있지만
깊이 우선 탐색(DFS)이라는 알고리즘을 알고 있으면
바로 이를 이용해서 접근할 수 있습니다.
다양한 알고리즘에 대한 자료는 아래 링크를 참고하세요.
단순화하자
문제는 복잡함에 있습니다.
아무리 복잡한 문제도 단순한 문제들의 집합에 불과합니다.
100개의 연산을 하는 문제는 1개의 연산을 100번 하는 것과 같습니다.
그러니 알고리즘의 과정을 세밀하게 나누면 더 쉬워지게 됩니다.
알고리즘의 논리 자체를 나누는 것 말고도 단순화를 다양하게 적용할 수 있습니다.
반복되는 과정을 함수로 따로 뺄 수도 있고,
머릿속에 떠올린 알고리즘을 노트에 적어보는 것도
추상적인 대상을 구체화한다는 점에서 단순화라고 할 수 있겠네요.
이렇듯 복잡한 문제를 쉽게 만드는 방법을 고민해야겠습니다.
쉽고 명확한 변수 이름을 쓰자
닌자 코드라는 은어가 있습니다.
사람들이 알아보지 못하는 코드를 말합니다.
변수 이름을 애매하게 정해서 그런 경우가 많습니다.
나만 보는 코드라고 해도 변수명을 막 지으면 힘들어집니다.
코딩을 하면서 저 변수가 무엇을 가리키는지 까먹을 수도 있고
설령 기억력이 좋은 편이라고 해도 하루 이틀이 지나 다시 코드를 작성하려고 할 때
변수명이 명확하지 않으면 코드를 위에서부터 하나하나 다시 파악해야하는 수고를 들여야합니다.
이런 닌자 코드를 피하고 싶으면 다음 링크를 참고하세요.
예제를 적어보자
때로는 명확한 변수명으로도 코드가 무엇을 하고 있는지 파악하기 어려운 때가 있습니다.
이때에는 옆에다 주석을 달아 알고리즘으로 처리하는 자료가 어떤 식으로 변하고 있는지를 보여주면 좋습니다.
하나의 입력값을 예로 두고 코드를 짜는 거죠.
const numbers = [];
numbers.push(1); // [1]
시간 복잡도
끝으로 시간 복잡도에 대해서 짧게 언급해야할 것 같습니다.
알고리즘이 처리될 때에는 비용이 따릅니다.
두 알고리즘이 똑같은 결과를 낸다고 할 때
더 속도가 빠르고 리소스가 덜 들어가는 알고리즘을 택하기 마련입니다.
사람들이 거의 사용하지 않는 서버라면 상관없겠지만
하루에도 몇만명이 사용하는 서비스의 서버라면 성능에 신경을 쓸 수밖에 없습니다.
사용자는 조금이라도 느려지거나 문제가 생기면 바로 이탈하기 때문입니다.
시간 복잡도를 표현할 때에는 Big O를 사용합니다.
컴퓨터의 연산 속도는 ms의 단위로 워낙 빠르기 때문에
이를 그대로 표현하는 건 큰 의미가 없고
각 알고리즘에 Big O를 써서 데이터량이 증가함에 따라 속도가 어떤 비율로 커지는지를 나타냅니다.
당연 Big O를 줄일 수 있게 알고리즘을 짜야겠죠.
'자료구조와 알고리즘' 카테고리의 다른 글
자바스크립트를 예제로 하는 자료구조와 알고리즘 2 - 배열(Array) (0) | 2021.02.24 |
---|---|
자바스크립트를 예제로 하는 자료구조와 알고리즘 1 - Big O (0) | 2021.02.24 |
시간 복잡도 (Time Complexity) (0) | 2020.03.24 |
리스트, 해시 테이블, 그래프, 트리 (Linked List, Hash Table, Graph, Tree) (0) | 2020.03.19 |
스택과 큐 (Stack & Queue) (0) | 2020.03.19 |