스크럼회의에서 처음으로 각자가 푼 알고리즘 문제를 풀이하는 시간도 가지고 모던 JS 딥다이브 북스터디 시작을 위한 회의도 진행했다.오늘 정말 코어타임동안 바빴던것 같다. 북스터디 깃허브 저장소를 만들기 위해 깃을 사용했는데 너무 오랜만이라 그런지 많이 삐걱댄 것 같다🤖🤖
자료구조의 종류들인 큐, 해시테이블, 그래프에 대한 강의도 들었는데 특히 연결리스트와 관련된 내용들과 베스트앨범 문제는 주말에 보충학습을 해야할 듯 하다. 화이팅 할 수 있다!!🔥
배열로 표현
한정된 공간의 배열이 꽉찬다면 더이상 큐에 값을 넣을 수 없다. 물론 JS에서는 배열이 자유롭게 증감해서 문제는 없지만 front나 rear의 인덱스 값이 무한대로 커질 수 있다. 따라서 배열에서 공간을 앞당기는 작업이 추가적으로 필요하며 이는 O(n)을 요구한다. 이런 문제를 해결하기 위해 연결리스트로 표현하면 된다.
//큐를 배열로 표현하기
class Queue {
constructor() {
this.queue = [];
this.front = 0;
this.rear = 0;
}
enqueue(value) {
this.queue[this.rear++] = value;
}
dequeue() {
const value = this.queue[this.front];
delete this.queue[this.front];
this.front += 1;
return value;
}
peek() { //front값 반환
return this.queue[this.front];
}
size() {
return this.rear - this.front;
}
}
const queue = new Queue();
queue.enqueue(1);
queue.enqueue(2);
queue.enqueue(4);
console.log(queue.dequeue()); //1
queue.enqueue(8);
console.log(queue.size()); //3
console.log(queue.peek()); //2
console.log(queue.dequeue()); //2
console.log(queue.dequeue()); //4
연결리스트로 표현하기
class Node {
constructor(value) {
this.value = value;
this.next = null;
}
}
class Queue {
constructor() {
this.head = null;
this.tail = null;
this.size = 0;
}
enqueue(newValue) {
const newNode = new Node(newValue);
if (this.head === null) {
this.head = this.tail = newNode;
} else {
this.tail.next = newNode;
this.tail = newNode;
}
this.size += 1;
}
dequeue() {
const value = this.head.value;
this.head = this.head.next;
this.size -= 1;
return value;
}
peek() {
return this.head.value;
}
}
const queue = new Queue();
queue.enqueue(1);
queue.enqueue(2);
queue.enqueue(4);
console.log(queue.dequeue()); //1
queue.enqueue(8);
console.log(queue.size); //3
console.log(queue.peek()); //2
console.log(queue.dequeue()); //3
console.log(queue.dequeue()); //4
⭐ shift 함수는 권장하지 않는다!!
shift()는 선형시간O(n)이 걸리기 때문에 큐에서 기대하는 로직이 수행되지 않는다
Front와 Rear가 이어져있는 큐. 원형 큐는 Linked List로 구현했을 때 이점이 없다.
//원형 큐를 배열로 구현하기
class Queue {
constructor(maxSize) {
this.maxSize = maxSize;
this.queue = [];
this.front = 0;
this.rear = 0;
this.size = 0;
}
enqueue(value) {
if (this.isFull()) {
console.log("Queue is full");
return;
}
this.queue[this.rear] = value;
this.rear = (this.rear + 1) % this.maxSize;
this.size += 1;
}
dequeue() {
const value = this.queue[this.front];
delete this.queue[this.front];
this.front = (this.front + 1) % this.maxSize;
this.size -= 1;
return value;
}
isFull() {
return this.size === this.maxSize;
}
peek() {
return this.queue[this.front];
}
}
const queue = new Queue(4);
queue.enqueue(1);
queue.enqueue(2);
queue.enqueue(4);
queue.enqueue(8);
queue.enqueue(16); //Queue is full.
console.log(queue.dequeue()); //1
console.log(queue.dequeue()); //2
console.log(queue.size); //2
console.log(queue.peek()); //4
queue.enqueue(16);
queue.enqueue(32);
console.log(queue.isFull()); //true
해쉬란?
고기와 감자를 잘게 다져 요리한것
입력받은 key를 잘게 잘라 숫자로 만든다는 것
= 입력받은 값을 특정 범위 내 숫자로 변경하는 함수
만약 해시 함수의 결과가 동일하여 겹친다면?(=해시 충돌이 일어난다)
학생 정보 관리 시스템
빠르게 값을 찾아야하는 경우 해시 테이블을 사용하는 것이 좋다.
const table = [];
table["key"] = 100;
table["key2"] = "Hello";
console.log(table["key"]);
table["key"] = 349;
console.log(table["key"]); //349
delete table["key"];
console.log(table["key"]); //undefined
객체 이용. 제일 간단하고 정석적인 방법이다.
Map사용
Set 사용
해시함수 위키백과 https://ko.wikipedia.org/wiki/%ED%95%B4%EC%8B%9C_%ED%95%A8%EC%88%98
프로그래머스 데브코스 FE 강의