늦은 밤 운동 + 부족한 수면 시간으로 몸이 무너지는 것 같았다. 거기에 어제 늦잠 하루 잤다고 악마가 유혹했다. 오늘도 좀 더 자면 어떻냐고, 너 이미 1주일 치 미리 해놨다며 라고. 근데 어찌어찌 책상에 앉아 정신을 차리게 되었다. 페어 시간 끝부턴 졸 정도로 힘들었지만, 그건 뭐 끝날 즘이니까 괜찮지
Stack
쌓다. 데이터를 순서대로 쌓는 구조. 입출력 하나의 방향으로 이루어진 제한적 접근
LIFO(Last In First Out) 혹은 FILO(First In Last Out)
push: 넣기 / pop: 빼기
하나씩 넣고 빼고 + 하나의 입출력 방향
예시 : 브라우저 앞으로 뒤로 가기
Queue
대기 행렬 (톨게이트, 진입 순서대로 통과)
LILO or FIFO
enqueue / dequeue
입력 순서대로 처리할 때 사용, 데이터 입 출력 방향 다름. 하나씩
컴퓨터 장치들 사이 데이터 주고 받을 때 속도, 시간 차이 극복위해 임시 기억 장치 자료구조로 queue 사용 : 버퍼
Graph
복잡한 네트워크 망 모습
구조 : 직접적 관계 있으면 선, 간접이면 거쳐서
점 : 정점 (vertex)
선 : 간선 (edge)
언제 사용? : 가장 빠른 경로 or 두 정점 사이 관계 있는지 확인
인접 리스트 : 각 정점이 어떤 정점과 인접하는지 리스트 형태로 표현
인접 리스트 : 메모리를 효율적으로 사용하고 싶을 때(연결 가능한 모든 경우의 수 저장해 메모리 많이)
예시 : 검색 엔진, sns, 길찾기
그래서 Graphql이었구나
비 가중치 그래프 : 이어진 거 밖에 정보 없음
가중치 그래프 : 연결 정도(거리 등)
인접 정점(adjacent vertext) : 직접 연결되어 있는 정점
무향, 방향 그래프 : 단방향이냐 양방향이냐
진입차수(in-degree) / 진출차수(out-degree)
자기 루프 : 간선이 바로 자기한테 올 때
사이클 : 한 정점에서 출발해 여러 거쳐서 나한테 올때
Tree
단방향 구조, 하나의 뿌리로부터 가지 사방으로
깊이 : root 0 / 그 밑 1
레벨 : 같은 깊이 가지고 있는 노드 묶어서, 형제 노드
높이 : 리프 노트 기준으로 루트까지의 높이
서브 트리 : root에서 뻗어 나오는 큰 트리 내부에 트리 구조를 갖춘 작은 트리
이진트리(binary) : 자식 노드가 최대 두개인 노드들의 트리
정 이진트리 (Full binary tree) : 각 노드가 0 or 2
포화 이진트리(Perfect) : 정 이진 + 완전 . 레벨 동일하면서 꽉 차있는
이진 탐색트리(binary search) : 모든 왼쪽 자식 값이 루트나 부모보다 작고, 오른쪽 자식은 루트나 부모보다 큼
트리 순회 : 목적을 위해 모든 노트 한 번씩 방문 (무조건 왼쪽부터)
전위 순회(preorder) : 왼쪽따라 확인하면서 내려가고, 끝나면 하나 올라와서 오른쪽
중위 순회(inorder) : 확인 안하고 왼쪽 끝 내려가 확인 후, 올라와서 확인, 오른쪽 확인 후 올라가 올라가
후위 순회(postorder) : 확인 안하고 왼쪽 끝 확인 후, 그 옆 확인, 부모로 올라가
구성 요소
// 우선순위 저장 위해 사용되는 클래스 정의
class QElement {
constructor(element, priority)
{
this.element = element;
this.priority = priority;
}
}
// 우선 순위 큐 클래스
class PriorityQueue {
constructor()
{ this.items = [];
}
// 메소드들
// 삽입 메소드
enqueue(element, priority)
{
// qElement 생성
const qElement = new QElement(element, priority);
let contain = false;
// 전체 데이터 순회하며 우선 순위에 맞는 위치 탐색
for(let 1 = 0 ; i < this.items.length ; i ++) {
if(this.items[i].priority > qElement.priority) {
this.items.splice(i,0,qElement);
contain = true;
break
}
}
// 가장 낮은 우선 순위면 마지막에
if(!contain) {
this.items.push(qElement)
}
// 삭제 메소드 shift() = 첫 번째삭제하고 반환
dequeue() {
if(this.isEmpty())
return "우선 순위 큐가 비어 있습니다.";
return this.items.shift();
}
// 첫, 끝 반환 걍 this.items[0], this.items[this.items.length -1]
함수 선언할 때 쓴 받는 값 : 매개 변수 (추상적)
함수를 사용할 때 넣는 값 : 인자 (구체적)
콜백 함수 : 콜백 함수를 받는 함수
고차가 콜백일 수도, 콜백이 고차일 수도
메소드 : 객체 내부 함수(arr.map or arr["map"])
arr.reduce((acc,cur))에서 초기값 안 넣으면 1번이 acc에, 2번이 cur에, 리턴 값을 다시 acc에
추상화를 통한 효율성 증대!