꾸준한 개발자

계속적인 성장을 추구하는 개발자입니다. 꾸준함을 추구합니다.

계속 쓰는 개발 노트

JAVASCRIPT/자바스크립트 알고리즘

자료와 자료구조 그리고 알고리즘

gold_dragon 2020. 12. 28. 15:47

✔ 자료란

현실 세계로부터 수집한 사실이나 개념의 값 또는 이들의 집합입니다. 특정 용도로 사용하기 위해 처리하거나 가공한 것을 정보라 합니다.

 

예를 들어 A반에 각각 90점, 95점, 85점을 받은 세 명의 학생이 있고, B반에 각각 40점, 90점, 100점을 받은 세 명의 학생들이 있다고 생각해봅시다. 여기서 학생들이 받은 점수가 자료가 되며, 만약 반끼리 비교하기 위해 평균을 구했다면, 평균이 정보에 해당합니다.

✔ 자료구조란

자료구조는 자료 값의 모임, 자료 간의 관계, 그리고 자료에 적용할 수 있는 함수나 명령을 의미합니다. 자료는 리스트 구조, 트리 구조 등의 관계를 갖게 됩니다.

✔ 자료구조의 특징

내가 원하는 목적에 맞게 효율적으로 동작합니다.

 

그리고 추상화가 가능해야 합니다. 추상화란 상위 개념에서 사용하기 위해 주어진 객체, 작업의 속성들 중 사용자에게 필요하지 않은 부분은 은닉 또는 삭제시키는 것입니다. 추상화를 통해 일부 속성들만을 가지고 주어진 객체, 작업들을 필요한 정도로 묘사할 수 있습니다.

 

그리고 자료구조는 재사용성을 가져야 됩니다.

✔ 자료구조의 종류

자료구조는 선형구조와 비선형구조로 나뉘어집니다. 

 

선형구조는 말 그대로 일자 모양으로 이루어져있는 구조입니다. 데이터가 연속적으로 연결되어 있는 모양으로 구성하는 방법입니다. 선형구조에는 순차 리스트, 연결 리스트, 스택, 큐 등이 있습니다.

 

비선형구조는 선형구조와 반대로 일자 모양이 아닌 여러 갈래로 나뉘어져 있는 구조입니다. 하나의 자료 뒤에 여러 개의 자료가 존재할 수 있습니다. 비선형구조에는 트리, 그래프 등이 있습니다.

✔ 자료구조의 필요성

프로그램에서는 다양한 자료를 임시 메모리나 영구적으로 파일 시스템을 쓰거나 데이터베이스를 사용하여 저장하고 사용합니다. 상황에 따라 적절한 자료구조를 선택해서 사용을 해야됩니다. 자료구조의 선택은 프로그램에 많은 영향을 끼칩니다. 필요한 자료에 효율적으로 빠르게 접근할 수 있게 하고, 자료의 중복을 최소화해서 저장장치를 효율적으로 사용할 수 있게 하고, 자료구조 별로 적절한 알고리즘을 기계적으로 적용할 수 있게 하고, 동료들과의 협업에서 잘못된 창의성을 발휘하지 않도록 도와줍니다.

✔ 알고리즘이란

문제를 해결하기 위한 여러 동작들의 모임입니다. 입력과 결과가 아닙니다. 입력과 결과는 중간의 과정을 알 수 없습니다. 알고리즘은 그 중간의 과정을 말합니다.

 

예를 들어 학교 교실안에서 3 * 3 형태로 책상이 배치돼 있고, a, b, c 세 명의 학생들이 앉아있는 모습을 생각해보겠습니다. 학생 세 명을 가장 뒷자리 3개의 자리에 앉히고 싶다면, 학생들을 가장 뒷자리에 차례로 앉히는 알고리즘이 존재하게 됩니다.

while (뒤 3자리가 다 차 있지 않다면) {
    1. 칠판에서 가장 가까운 학생을 선택
    2. 뒷자리에서 가장 오른쪽에 다른 학생이 존재하는지 확인
    3. 존재한다면 그 왼쪽 학생이 있는지 확인 존재하지 않다면 가장 오른쪽에 앉힌다.
    4. 없다면 앉힌다.
    ...
}

✔ 알고리즘의 조건

입력, 출력, 명확성, 유한성, 효과성을 갖어야 됩니다.

 

입력은 외부에서 제공하는 자료를 뜻합니다.

출력은 적어도 2가지 이상의 다른 결과를 출력하는 특성을 가리킵니다. 즉, 모든 입력에 대해 동일한 출력을 내서는 안됩니다.

명확성은 수행 과정은 명확한 명령어로 구성되어 있어야 함을 가리킵니다.

유한성은 유한한 시간 안에 종료되어야 한다는 것을 뜻합니다. 무한루프가 존재해서는 안됩니다.

효과성은 모든 과정은 사람이 종이와 연필로 유한한 시간 안에 수행할 정도로 단순하고 명백해야 된다는 뜻을 갖습니다.

✔ 알고리즘의 필요성

웹 애플리케이션이 서비스하는 규모가 점점 커지고 있습니다. 쇼핑몰을 다룬다고 생각해 볼 때, 십만 명과 백만 건의 Item 사이의 관계를 다루려면 (100,000 * 1,000,000)개의 관계에 접근하고 다뤄야 됩니다. 만약 효율적인 알고리즘으로 동작한다면 그만큼 서비스의 반응성의 효율을 올릴 수 있습니다.

 

또한 최근 많은 기업이 클라우드로 서비스를 제공하고 있습니다. 많은 서버를 물리적으로 구매하거나 유지, 관리하는 비용을 아낄 수 있기 때문입니다.보안 관련해서도 직접 해결하기 어려운 문제를 쉽게 해결할 수 있습니다. 그런데 클라우드 서버의 비용은 실제로 임대한 서버의 Spec과 시간에 비례합니다. 효율적인 알고리즘은 연산 속도를 개선하여 더 낮은 서버 Spec으로도 동일한 서비스를 제공할 수 있고, 비용을 절약할 수 있습니다.

✔ Javascript와 알고리즘

자바스크립트는 웹 브라우저를 위한 언어로, 알고리즘을 구현하기 위한 메이저한 언어는 아닙니다. 하지만 Node.js로 백엔드 구현이 가능해지면서 다양한 알고리즘이 구현된 라이브러리가 제공되고 있습니다. 그리고 기본적인 자료구조는 구현되어 있습니다. 특히 Array, String에 유용한 Method들이 많이 구현되어 있습니다. OOP(Object-Oriented Programming), FP(Functional Programming)를 모두 지원하고 있다는 것도 장점입니다.

✔ Javascript에 구현된 알고리즘

Array -> sort(정렬), find(조건 탐색), indexOf(Element 탐색), reduce(연쇄 연산) 등

String -> match(정규식 매칭), search(검색), split(나누기), slice(가르기) 등

Math -> max(최댓값), min(최솟값) 등

 


※ 참조

1. 강사 신제용, 패스트캠퍼스 자료구조와 알고리즘 강의

2. 추상화 관련해서 찾아본 블로그 - dad-rock.tistory.com/198

3. 선형구조와 비선형구조 관련해서 추가적으로 찾아본 블로그 - server-engineer.tistory.com/130