1) 선형 구조
2) 비선형 구조
하나의 데이터 뒤에 다른 데이터가 하나 존재하는 자료구조
→ 데이터가 일렬로 연속적으로(순차적으로) 연결되어 있다.
하나의 데이터 뒤에 다른 데이터가 여러 개 올 수 있는 자료구조
→ 데이터가 일직선상으로 연결되어 있지 않아도 됨
[특징]
1) 대괄호 사용
// 빈 배열 생성
let arr = [];
arr.push(7);
arr.push(8);
arr.push(9);
for (let i=0;i<arr.length;i++){
console.log(arr[i]);
}
// 7
// 8
// 9
2) Array() 사용
// 빈 배열 생성
let arr = new Array();
arr.push(7);
arr.push(8);
arr.push(9);
for (let i=0;i<arr.length;i++){
console.log(arr[i]);
}
// 7
// 8
// 9
3) 임의의 크기를 가지는 배열 생성
// 원하는 값을 직접 입력하여 초기화
let arr1 = [0,1,2,3,4];
console.log(arr1);
// [0,1,2,3,4]
// 하나의 값으로 초기화
let arr2 = Array.from({length: 5}, () => 7);
console.log(arr2);
// [7,7,7,7,7]
4) 2차원 리스트(배열) 만들기
// 원하는 값을 직접 입력하여 초기화
let arr1 = [
[0,1,2,3],
[4,5,6,7],
[8,9,10,11]
];
console.log(arr1);
5) ES6이상부터 사용할 수 있는 2차원 배열 생성
// 빈 배열 생성
let arr = Array.from(Array(4), () => new Array(5))
console.log(arr);
/*
[
[ <5 empty items> ],
[ <5 empty items> ],
[ <5 empty items> ],
[ <5 empty items> ]
]
*/
6) 반복문 이용하여 2차원 배열 초기화
let arr2 = new Array(3);
for (let i=0;i<arr2.length;i++){
arr2[i] = Array.from(
{length: 4},
(undefined, j) => i*4+j
);
}
console.log(arr2);
/*
[
[0,1,2,3],
[4,5,6,7],
[8,9,10,11]
]
*/
7) 배열 생성 후에도 배열의 크기 임의로 변경 가능, push()
메서드 이용하여 배열 가장 뒤쪽에 새로운 원소 추가
let arr2 = [5,6,7,8,9];
arr.length=8;
arr[7]=3;
arr.push(1);
for (let x of arr){
console.log(x);
}
/*
5
6
7
8
9
undefined
undefined
3
1
*/
1) concat()
: 여러 개의 배열을 이어 붙여서 합친 결과 반환 → **O(N)**
let arr1 = [1,2,3,4,5];
let arr2 = [6,7,8,9,10];
let arr = arr1.concat(arr2, [11,12], [13]);
console.log(arr);
/*
[
1,2,3,4,5,6,
7,8,9,10,11,12,13
]
*/
2) slice(left, right)
: 특정 구간의 원소를 꺼낸 배열을 반환 → O(N)
let arr = [1,2,3,4,5];
let result = arr.slice(2,4);
console.log(result);
// [3,4]
3) indexOf()
: 특정한 값을 가지는 원소의 첫째 인덱스를 반환 → O(N)
let arr = [7,3,5,6,6,2,1];
console.log(arr.indexOf(5));
console.log(arr.indexOf(6));
console.log(arr.indexOf(8));
// 2
// 3
// -1
각 노드가 한 줄로 연결되어 있는 자료구조
(데이터, 포인터)
형태를 가짐삽입(push): 스택에 원소를 삽입하는 연산(마지막 위치에 삽입) → O(1)
추출(pop): 스택에 원소를 추출하는 연산(마지막 위치 추출) → O(1)
최상위 원소(top): 스택의 최상위 원소(마지막에 들어온 원소)를 확인하는 연산 → O(1)
Empty: 스택이 비어 있는지 확인하는 연산 → O(1)
push()
: 마지막 위치에 원소 삽입
pop()
: 마지막 위치에서 원소 추출
ex)
let stack = [];
stack.push(5);
stack.push(2);
stack.push(1);
stack.pop();
stack.push(4);
let reversed = stack.slice().reverse();
console.log(reversed); // 최상단 원소부터 출력
console.log(stack);
// [1,3,2,5]
// [5,2,3,1]
1) 큐 클래스 생성하여 사용
class Queue{
constructor(){
this.items = {};
this.headIndex = 0;
this.tailIndex = 0;
}
enqueue(item){
this.items[this.tailIndex] = item;
this.tailIndex++;
}
dequeue(){
const item = this.items[this.headIndex];
delete this.items[this.headIndex];
this.headIndex++;
return item;
}
peek(){
return this.items[this.headIndex];
}
getLength(){
return this.tailIndex - this.headIndex;
}
}
2) 큐 라이브러리 사용
queue = new Queue();
queue.enqueue(5);
queue.enqueue(2);
queue.enqueue(3);
queue.dequeue();
// 큐가 비어있지 않을 때까지 반복
while (queue.getLength() != 0){
console.log(queue.dequeue());
}
// 2
// 3
최대 2개의 자식을 가질 수 있는 트리
포화 이진 트리(Full Binary Tree)
: 리프 노드를 제외한 모든 노드가 두 자식을 가지고 있는 트리완전 이진 트리(Complete Binary Tree)
: 모든 노드가 왼쪽 자식부터 차근차근 채워진 트리높이 균형 트리(Height Balanced Tree)
: 왼쪽 자식 트리와 오른쪽 자식 트리의 높이가 1이상 차이나지 않는 트리우선순위에 따라서 데이터를 추출하는 자료구조
원소들 중에서 최댓값 혹은 최솟값을 빠르게 찾아내는 자료구조
최대 힙
최소 힙
Heapify
heapify()
진행https://github.com/ndb796/priorityqueuejs/blob/master/index.js
// 최대 힙
let pq = new PriorityQueue(function(a,b) {
return a.cash - b.cash;
});
pq.enq({cash:250, name:'Doohyun Kim'});
pq.enq({cash:300, name:'Gildong Hong'});
pq.enq({cash:150, name:'Minchul Han'});
console.log(pq.size()); // 3
console.log(pq.deq()); // {cash:300, name:'Gildong Hong'}
console.log(pq.peek()); // {cash:250, name:'Doohyun Kim'}
console.log(pq.size()); // 2
→ 행이 시작 노드, 열이 도착 노드 → 드는 비용 표시
O(V^2)
의 공간 요구O(V+E)
의 공간 요구O(V)
시간 필요