ํ๋ก๊ทธ๋๋จธ์ค ๋ฌธ์ ํ์ด - ๋ฌธ์์ด ๋ด ๋ง์๋๋ก ์ ๋ ฌํ๊ธฐ / Array.sort()
๋ ธ๋ ๊ธฐ๋ฐ ์๋ฃ ๊ตฌ์กฐ / ์ฐ๊ฒฐ ๋ฆฌ์คํธ / ์ด์ค ์ฐ๊ฒฐ ๋ฆฌ์คํธ / ์ด์ค ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ํ ๊ตฌํ
๐ ์ฒ์ ์์ฑํ ํ์ด
function solution(strings, n) {
const arr = [];
for (let i = 0; i < strings.length; i++) {
arr.push(strings[i].substring(n));
}
arr.sort();
const answer = [];
for (let i = 0; i < arr.length; i++) {
const subString = arr[i];
for (let j = 0; j < arr.length; j++) {
if (subString === strings[j].substring(n)) {
answer.push(strings[j]);
break;
}
}
}
return answer;
}
๐ ๋ ๋ฒ์งธ ์์ฑํ ํ์ด
์ฒ์ ํ์ด๋ ์๋ ์กฐ๊ฑด์ ๋ด ๋ง๋๋ก ์ถ์ธกํด์ ๋ผ์๋ฃ์ ์๋ชป๋ ํ์ด์๋ค. ์์ ํ ๊ฒ ์๋๋ผ ์์ ๊ฐ์์์ด์ผ ํ ๊ฑฐ ๊ฐ์์ ๊ทธ๋ฅ ๋ฐฉํฅ์ ๋ฐ๊ฟจ๋ค.
sort(๋น๊ต ํจ์)
ํ์ฉ
๋น๊ต ํจ์์ return ๊ฐ (1
: b ๋จผ์ / -1
: a ๋จผ์ / 0
: ๊ทธ๋๋ก)
function solution(strings, n) {
const answer = strings.sort((a, b) => {
if(a[n] > b[n]) {
return 1;
} else if (a[n] < b[n]) {
return -1;
} else {
if(a > b) {
return 1;
} else if(a < b) {
return -1;
} else {
return 0;
}
}
});
return answer;
}
๐ ์๊ณ ๋ฆฌ์ฆ๋ฟ ์๋๋ผ ์๋ฃ ๊ตฌ์กฐ๋ ์ฌ๊ท์ ์ผ ์ ์๋ค. ๋ํ์ ์ผ๋ก ์ฐ๊ฒฐ ๋ฆฌ์คํธ, ์ด์ง ํธ๋ฆฌ, ๊ทธ๋ํ ๋ฑ์ด ์๋ค.
๐
์ฐ๊ฒฐ ๋ฆฌ์คํธ
๋ ๋ ธ๋ ๊ธฐ๋ฐ ์๋ฃ ๊ตฌ์กฐ์ด๋ค.
[ ๊ณตํต์ ]
[ ์ฐจ์ด์ ]
์ฐ๊ฒฐ ๋ฆฌ์คํธ
๋
ธ๋
๋ผ๊ณ ๋ถ๋ฅธ๋ค.๋ฐ์ดํฐ
๋ฅผ, ๋ ๋ฒ์งธ ์
์๋ ๋ค์ ๋
ธ๋์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์
๋ฅผ ์ ์ฅํด์ผ ํ๋ค.์ฒซ ๋ฒ์งธ ๋
ธ๋๊ฐ ๋ฉ๋ชจ๋ฆฌ์ ์ด๋์์ ์์ํ๋์ง
๋ฅผ ์์์ผ ํ๋ค. ๊ทธ๋์ผ ๊ฐ ๋
ธ๋์ ๋ ๋ฒ์งธ ์
์ ๋งํฌ๋ค์ ํ๊ณ ๋ค์ด๊ฐ์ ๋ฆฌ์คํธ๋ฅผ ์กฐํฉํ ์ ์๋ค.pp.219 ~ 220
Ruby๋ก ๊ตฌํ๋ ์ฝ๋ โ JavaScript๋ก ๋ณํ
Node ํด๋์ค ๊ตฌํ
- ๋ ธ๋ class๋ฅผ ์ด์ฉํด ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ฅผ ๋ง๋ค ์ ์๋ค.
- ๊ทธ๋ฌ๋, ์ฐ๊ฒฐ ๋ฆฌ์คํธ์ ๊ฐ ๋ ธ๋๋ ์ธ์ ํ์ง ์๊ธฐ ๋๋ฌธ์ ํ๋ก๊ทธ๋จ์ด ์ฐ๊ฒฐ ๋ฆฌ์คํธ์ ๋ฐ์ดํฐ์ ์ ๊ทผํ๊ธฐ ์ํด์๋ ๋งํฌ๋ฅผ ํ๊ณ ํ๊ณ ๋ค์ด๊ฐ์ผ ํ๋ค. ํ์ง๋ง, ๋ ธ๋ class๋ง์ผ๋ก๋ ์ฐ๊ฒฐ ๋ฆฌ์คํธ๊ฐ ์ด๋์ ์์ํ๋์ง๋ฅผ ์ ์ ์๋ค.
// ๋
ธ๋ class
class Node {
constructor (data) {
this.data = data;
this.next_node = null;
}
}
// ๋
ธ๋ 4๊ฐ์ง๋ฆฌ ์ฐ๊ฒฐ ๋ฆฌ์คํธ ์์ฑ โ
const node_1 = new Node('once');
const node_2 = new Node('upon');
node_1.next_node = node_2;
const node_3 = new Node('a');
node_2.next_node = node_3;
const node_4 = new Node('time');
node_3.next_node = node_4;
console.log(node_1); // Node {data: 'once', next_node: Node}
console.log(node_2); // Node {data: 'upon', next_node: Node}
console.log(node_3); // Node {data: 'a', next_node: Node}
console.log(node_4); // Node {data: 'time', next_node: null}
LinkedList ํด๋์ค ์ถ๊ฐ
- list ๋ณ์๋
์ฐ๊ฒฐ ๋ฆฌ์คํธ์ ์ฒซ ๋ฒ์งธ ๋ ธ๋
๋ฅผ ๊ฐ๋ฆฌํจ๋ค.
- ๋ฐ๋ผ์, ์ฐ๊ฒฐ ๋ฆฌ์คํธ class๋ฅผ ์ฌ์ฉํ๋ฉด, ํ๋ก๊ทธ๋จ์๊ฒ ์ฐ๊ฒฐ ๋ฆฌ์คํธ๊ฐ ์ด๋์๋ถํฐ ์์ํ๋์ง ์๋ ค์ค ์ ์๋ค.
class Node {
constructor (data) {
this.data = data;
this.next_node = null;
}
}
const node_1 = new Node('once');
const node_2 = new Node('upon');
node_1.next_node = node_2;
const node_3 = new Node('a');
node_2.next_node = node_3;
const node_4 = new Node('time');
node_3.next_node = node_4;
// LinkedList ํด๋์ค ์ถ๊ฐ โ
class LinkedList {
constructor (first_node) {
this.first_node = first_node;
}
}
const list = new LinkedList(node_1);
console.log(list); // LinkedList {first_node: Node}
์ฝ๊ธฐ, ๊ฒ์, ์ฝ์
, ์ญ์
๋ฉ์๋ ์ถ๊ฐpp.221 ~ 229
Ruby๋ก ๊ตฌํ๋ ์ฝ๋ โ JavaScript๋ก ๋ณํ
// ๐ก ๋
ธ๋ class
class Node {
constructor (data) {
this.data = data;
this.next_node = null;
}
}
// ๋
ธ๋ 4๊ฐ์ง๋ฆฌ ์ฐ๊ฒฐ ๋ฆฌ์คํธ ์์ฑ
const node_1 = new Node('once');
const node_2 = new Node('upon');
node_1.next_node = node_2;
const node_3 = new Node('a');
node_2.next_node = node_3;
const node_4 = new Node('time');
node_3.next_node = node_4;
// ๐ก ์ฐ๊ฒฐ ๋ฆฌ์คํธ class
class LinkedList {
constructor (first_node) { // ๊ฐ์ฒด ์์ฑ ์ ์ฐ๊ฒฐ ๋ฆฌ์คํธ์ ์ฒซ ๋ฒ์งธ ๋
ธ๋๋ฅผ ์ ์ด์ค
this.first_node = first_node;
}
// ์ฝ๊ธฐ โ
read(index) {
curr_node = this.first_node;
curr_index = 0;
while (curr_index < index) {
curr_node = curr_node.next_node;
curr_index++;
}
return curr_node.data;
}
// ๊ฒ์ โ
index_of(value) {
let curr_node = this.first_node;
let curr_index = 0;
if (curr_node.data === value) {
return curr_index;
}
while (curr_node.data !== value && curr_node.next_node !== null) {
curr_node = curr_node.next_node;
curr_index++;
}
return curr_node.data === value ? curr_index : null;
}
// ์ฝ์
โ
insert_at_index(index, value) {
let curr_node = this.first_node;
let curr_index = 0;
while (curr_index < index - 1) { // ๐โโ๏ธ
curr_node = curr_node.next_node;
curr_index++;
}
const new_node = new Node(value);
new_node.next_node = curr_node.next_node;
curr_node.next_node = new_node;
}
// ์ญ์ โ
delete_at_index(index) {
let curr_node = this.first_node;
let curr_index = 0;
while (curr_index < index - 1) {
curr_node = curr_node.next_node;
curr_index++;
}
curr_node.next_node = curr_node.next_node.next_node;
}
}
const list = new LinkedList(node_1);
const forthData = list.read(3);
console.log(forthData); // time
const indexOfValue = list.index_of('๋ฉ๋กฑ');
console.log(indexOfValue); // null
list.insert_at_index(2, 'ํค์ด');
console.log(list);
// ์ธ๋ฑ์ค 2์(์ฐ๊ฒฐ ๋ฆฌ์คํธ์ 3๋ฒ์งธ ๋
ธ๋๋ก) 'ํค์ด'๋ผ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง ๋
ธ๋๊ฐ ์ถ๊ฐ๋จ
// ์ฐ๊ฒฐ ๋ฆฌ์คํธ ๋ฐ์ดํฐ : once upon ํค์ด a time
list.delete_at_index(2);
console.log(list);
// ์์์ ์ถ๊ฐ๋์๋ ๋
ธ๋๊ฐ ์ญ์ ๋จ
// ์ฐ๊ฒฐ ๋ฆฌ์คํธ ๋ฐ์ดํฐ : once upon a time
๐โโ๏ธ Q1. ์ฑ ์๋ ์ฌ๊ธฐ์ -1์ด ์ ์ฐ์ฌ ์๋ค. ๊ทผ๋ฐ -1์ ์ ์จ์ฃผ๋ฉด, insert_at_index(2, 'ํค์ด')๋ฅผ ์คํํ๋ฉด, ์ธ๋ฑ์ค 3์ 'ํค์ด'๋ผ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง ๋ ธ๋๊ฐ ์ถ๊ฐ๋๋ค. index๋ผ๋ ๋งค๊ฐ๋ณ์์ 2๋ฅผ ์จ์ฃผ๋ฉด ์ธ๋ฑ์ค 2์ ์ ๋ ธ๋๊ฐ ์ถ๊ฐ๋์ด์ผ ํ๋ ๊ฑฐ ์๋๊ฐ. ๊ฒ์ํด ๋ณด๋๊น ์๋๋ ์ฐ๊ฒฐ ๋ฆฌ์คํธ class์ ์์ฑ์ ํจ์์ head ํฌ์ธํฐ๋ฅผ ์ค์ ํด ์ฃผ๋๋ฐ ์ด ์ฑ ์์๋ ๋ฐ๋ก node_1์ ๋ฃ์ด์คฌ๋ค. ๊ทธ๊ฒ ๋๋ฌธ์ ๊ผฌ์ธ ๊ฑด๊ฐ ์ถ์๋ฐ ๋ด๊ฐ ๊ดํ ์ด์ํ ๋ฐ ๊ฝํ ๊ฑด์ง ๋ง๊ฒ ํ์ ํ ๊ฑด์ง ์ ๋ชจ๋ฅด๊ฒ ๋ค.
(๋ณด๋๊น ๋ค์ '์ญ์ ' ์ฝ๋ ๋ถ๋ถ์์ ๊ฐ์ ์ค๋ช ์๋ -1์ด ์ฐ์ฌ ์๋ค. '์ฝ์ ' ์ฝ๋์ ์คํ๊ฐ ๋ ๊ฑด๊ฐ?)
์ฝ๊ธฐ
์ต์
์ ์๋๋ฆฌ์ค๋ ์ฐ๊ฒฐ ๋ฆฌ์คํธ์ ๋ง์ง๋ง ์ธ๋ฑ์ค๋ฅผ ์ฐพ์๋ณด๋ ๊ฒ์ด๋ค.
๋ฐ๋ผ์, ์ฐ๊ฒฐ ๋ฆฌ์คํธ ์ฝ๊ธฐ์ ํจ์จ์ฑ
์ O(N)
์ด๋ค.
+) ๋ฐฐ์ด ์ฝ๊ธฐ์ ํจ์จ์ฑ์ธ O(1)์ ๋นํด ๋งค์ฐ ์ข์ง ์๋ค.
๊ฒ์
์ต์
์ ์๋๋ฆฌ์ค๋ ๊ฒ์ํ๋ ๊ฐ์ด ๋ง์ง๋ง ์
์ ์๊ฑฐ๋ ์์ ๋ฆฌ์คํธ์ ์๋ ๊ฒ์ด๋ค.
๋ฐ๋ผ์, ์ฐ๊ฒฐ ๋ฆฌ์คํธ ๊ฒ์์ ํจ์จ์ฑ
์ O(N)
์ด๋ค.
+) ๋ฐฐ์ด ๊ฒ์์ ํจ์จ์ฑ์ธ O(N)๊ณผ ๊ฐ๋ค.
์ฝ์
์ต์ ์ ์๋๋ฆฌ์ค๋ ์๋ก์ด ๋
ธ๋๋ฅผ ์ฐ๊ฒฐ ๋ฆฌ์คํธ์ ๋งจ ์์ ์ฝ์
ํ๋ ๊ฒ์ด๋ค.
์ต์
์ ์๋๋ฆฌ์ค๋ ์๋ก์ด ๋
ธ๋๋ฅผ ์ฐ๊ฒฐ ๋ฆฌ์คํธ์ ๋งจ ๋์ ์ฝ์
ํ๋ ๊ฒ์ด๋ค.
์ต์ ์ ์๋๋ฆฌ์ค์ ๊ฒฝ์ฐ, ํจ์จ์ฑ์ O(1)์ด๋ค.
์ต์
์ ์๋๋ฆฌ์ค์ ๊ฒฝ์ฐ, ํจ์จ์ฑ์ O(N)
์ด๋ค.
์๋ก์ด ๋ ธ๋๋ฅผ ์ถ๊ฐํ ์ธ๋ฑ์ค ์ด์ ์ ๋ ธ๋(curr_node)๋ฅผ ์ฐ๊ฒฐ ๋ฆฌ์คํธ ์ฒ์๋ถํฐ ์์๋๋ก ์ฐพ์ ํ์, ๊ทธ ๋ ธ๋์ ๋งํฌ(curr_node.next_node)๊ฐ ์ ๋ ธ๋(new_node)๋ฅผ ๊ฐ๋ฆฌํค๋๋ก ํด์ผ ํ๊ธฐ ๋๋ฌธ์ด๋ค.
+) ๋ฐฐ์ด ์ฝ์ ๊ณผ ์ฐ๊ฒฐ ๋ฆฌ์คํธ ์ฝ์ ์ ์ต์ ๊ณผ ์ต์ ์ ์๋๋ฆฌ์ค๊ฐ ๋ฐ๋์ด๋ค.
์ญ์
์ต์ ๊ณผ ์ต์
์ ์๋๋ฆฌ์ค, ํจ์จ์ฑ์ด ์ฝ์
๊ณผ ๋๊ฐ๋ค.
๋งจ ์์ ์ญ์ ํ ๋ ํจ์จ์ฑ์ O(1), ๋งจ ๋์ ์ญ์ ํ ๋ ํจ์จ์ฑ์ O(N)
์ด๋ค.
+) ๋ฐฐ์ด ์ญ์ ์ ์ฐ๊ฒฐ ๋ฆฌ์คํธ ์ญ์ ๋ํ ์ต์ ๊ณผ ์ต์ ์ ์๋๋ฆฌ์ค๊ฐ ๋ฐ๋์ด๋ค.
[ ๋ฐฐ์ด VS ์ฐ๊ฒฐ ๋ฆฌ์คํธ ]
์ฐ์ฐ | ๋ฐฐ์ด | ์ฐ๊ฒฐ ๋ฆฌ์คํธ |
---|---|---|
์ฝ๊ธฐ | O(1) | O(N) |
๊ฒ์ | O(N) | O(N) |
์ฝ์ | O(N)(๋์์ ํ๋ฉด O(1)) | O(N)(์์์ ํ๋ฉด O(1)) |
์ญ์ | O(N)(๋์์ ํ๋ฉด O(1)) | O(N)(์์์ ํ๋ฉด O(1)) |
์ด๋ ๊ฒ๋ง ๋ณด๋ฉด, ์ฐ๊ฒฐ ๋ฆฌ์คํธ๊ฐ ๋ฐฐ์ด๋ณด๋ค ๋์ ๊ฒ ์์ด ๋ณด์ธ๋ค.
ํ ๋ฆฌ์คํธ๋ฅผ ๊ฒ์ฌํด์ ๋ง์ ์์๋ฅผ ์ญ์
ํด์ผ ํ ๋, ์ฐ๊ฒฐ ๋ฆฌ์คํธ๊ฐ ๋ฐฐ์ด๋ณด๋ค ํจ์ฌ ํจ์จ์ ์ด๋ค.
ex) ์ด๋ฉ์ผ ์ฃผ์ ๋ฆฌ์คํธ๋ฅผ ๊ฒํ ํด ์ ํจํ์ง ์์ ํ์์ ์ด๋ฉ์ผ์ ๋ชจ๋ ์ญ์ ํ๊ณ ์ ํ ๋
๋ฐฐ์ด์ด๋ ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ , ์ ์ฒด ๋ฆฌ์คํธ๋ฅผ ์ฒ์๋ถํฐ ํ๋์ฉ ์ดํด๋ณด๋ฉด์ ๊ฒ์ฌํด์ผ ํ๋ฏ๋ก ์ผ๋จ ๊ธฐ๋ณธ์ ์ผ๋ก N๋จ๊ณ๊ฐ ๊ฑธ๋ฆฐ๋ค.
๊ทธ๋ฌ๋, ๋ฐฐ์ด์ ๊ฒฝ์ฐ, ๊ฐ ๊ฐ์ ์ญ์ ํ ๋๋ง๋ค ๊ทธ ๊ฐ ์ดํ์ ๋ชจ๋ ๊ฐ๋ค์ด ์ํํธ๋๋ค. ์ฆ, ๊ฐ ๊ฐ์ด ์ญ์ ๋ ๋๋ง๋ค 'N๋จ๊ณ'๊ฐ ์ถ๊ฐ๋ก ๋ ๊ฑธ๋ฆฐ๋ค.
๋ฐ๋ฉด์, ์ฐ๊ฒฐ ๋ฆฌ์คํธ์ ๊ฒฝ์ฐ, ๋ฆฌ์คํธ๋ฅผ ์ฒ์๋ถํฐ ํ๋์ฉ ์ดํด๋ณด๋ค๊ฐ ์ญ์ ํ ๊ฐ์ ๋ฐ๊ฒฌํ๋ฉด ๋งํฌ๊ฐ ๊ฐ๋ฆฌํค๋ ๊ฐ์ ๋ฐ๊ฟ์ฃผ๊ธฐ๋ง ํ๋ฉด ๋๋ค. ์ฆ, ๊ฐ ๊ฐ์ด ์ญ์ ๋ ๋๋ง๋ค '1๋จ๊ณ'๊ฐ ์ถ๊ฐ๋ก ๋ ๊ฑธ๋ฆด ๋ฟ์ด๋ค.
1000๊ฐ์ ์ด๋ฉ์ผ ์ค 100๊ฐ์ ์ ํจํ์ง ์์ ๋ฉ์ผ์ด ์๋ค๊ณ ํ์ ๋
๋ฐฐ์ด์ ๊ฒฝ์ฐ, 1000 + (100 x 1000) ๋จ๊ณ๊ฐ ๊ฑธ๋ฆฌ์ง๋ง
์ฐ๊ฒฐ ๋ฆฌ์คํธ์ ๊ฒฝ์ฐ, 1000 + (100 x 1) ๋จ๊ณ๊ฐ ๊ฑธ๋ฆด ๋ฟ์ด๋ค.
์ด์ค ์ฐ๊ฒฐ ๋ฆฌ์คํธ์ ๊ฐ ๋
ธ๋์๋ 2๊ฐ์ ๋งํฌ๊ฐ ์๋ค.
ํ ๋งํฌ๋ ๋ค์ ๋
ธ๋๋ฅผ ๊ฐ๋ฆฌํค๊ณ , ๋ค๋ฅธ ํ ๋งํฌ๋ ์ ๋
ธ๋๋ฅผ ๊ฐ๋ฆฌํจ๋ค.
cf. ์ฐ๊ฒฐ ๋ฆฌ์คํธ: ๋ค์ ๋
ธ๋๋ฅผ ๊ฐ๋ฆฌํค๋ 1๊ฐ์ ๋งํฌ
์ด์ค ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ ์ฒ์๊ณผ ๋ง์ง๋ง ๋
ธ๋๋ฅผ ๋ชจ๋ ๊ธฐ๋กํ๋ค.
cf. ์ฐ๊ฒฐ ๋ฆฌ์คํธ: ์ฒ์ ๋
ธ๋๋ง ๊ธฐ๋ก
p.232
Ruby๋ก ๊ตฌํ๋ ์ฝ๋ โ JavaScript๋ก ๋ณํ
// ๋
ธ๋ class (2๊ฐ์ ๋งํฌ๋ฅผ ๊ฐ์ง)
class Node {
constructor (data) {
this.data = data;
this.next_node = null;
this.prev_node = null;
}
}
// ์ด์ค ์ฐ๊ฒฐ ๋ฆฌ์คํธ class (์ฒ์๊ณผ ๋ง์ง๋ง ๋
ธ๋ ๋ชจ๋ ๊ธฐ๋ก)
class DoublyLinkedList {
constructor (first_node = null, last_node = null) {
this.first_node = first_node;
this.last_node = last_node;
}
}
์ฐ๊ฒฐ ๋ฆฌ์คํธ์์, ์ ๋
ธ๋๋ฅผ ๋งจ ๋์ ์ฝ์
ํ ๋์ ํจ์จ์ฑ์ O(N)์ธ ๋ฐ๋ฉด,
์ด์ค ์ฐ๊ฒฐ ๋ฆฌ์คํธ์์, ์ ๋
ธ๋๋ฅผ ๋งจ ๋์ ์ฝ์
ํ ๋์ ํจ์จ์ฑ์ O(1)
์ด๋ค.
์ด์ค ์ฐ๊ฒฐ ๋ฆฌ์คํธ์์๋ ๊ธฐ๋กํด๋์ ๋ง์ง๋ง ๋ ธ๋์ ๋ฐ๋ก ์ ๊ทผํ ์ ์๊ณ , ๊ฐ ๋ ธ๋๊ฐ ๋ฐ๋ก ์ ๋ ธ๋๋ฅผ ๊ฐ๋ฆฌํค๋ ๋งํฌ๋ฅผ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ด๋ค.
p.233
Ruby๋ก ๊ตฌํ๋ ์ฝ๋ โ JavaScript๋ก ๋ณํ
// ๐ก ๋
ธ๋ class
class Node {
constructor (data) {
this.data = data;
this.next_node = null;
this.prev_node = null;
}
}
// ๋
ธ๋ 4๊ฐ์ง๋ฆฌ ์ฐ๊ฒฐ ๋ฆฌ์คํธ ์์ฑ
const node_1 = new Node('my');
const node_2 = new Node('name');
node_1.next_node = node_2;
node_2.prev_node = node_1;
const node_3 = new Node('is');
node_2.next_node = node_3;
node_3.prev_node = node_2;
const node_4 = new Node('syong');
node_3.next_node = node_4;
node_4.prev_node = node_3;
// ๐ก ์ด์ค ์ฐ๊ฒฐ ๋ฆฌ์คํธ class
class DoublyLinkedList {
constructor (first_node = null, last_node = null) {
this.first_node = first_node;
this.last_node = last_node;
}
// ์ด์ค ์ฐ๊ฒฐ ๋ฆฌ์คํธ ๋งจ ๋์ ์ ๋
ธ๋ ์ฝ์
โ
insert_at_end(value) {
const new_node = new Node(value); // ์ ๋
ธ๋ ์์ฑ
if (!this.first_node) { // ๋ฆฌ์คํธ์ ์์ง ๋
ธ๋๊ฐ ์์ ๋
this.first_node = new_node;
this.last_node = new_node;
} else { // ๋ฆฌ์คํธ์ ๋
ธ๋๊ฐ ์์ ๋
new_node.prev_node = this.last_node;
this.last_node.next_node = new_node;
this.last_node = new_node; // ๊ผญ ๋ง์ง๋ง ๋
ธ๋๋ฅผ '์ ๋
ธ๋'๋ก ๋ฐ๊ฟ์ค ๊ฒ!!
}
}
}
const list = new DoublyLinkedList(node_1, node_4);
console.log(list); // DoublyLinkedList {first_node: Node, last_node: Node}
list.insert_at_end('๐');
console.log(list);
// ๋ฆฌ์คํธ ๋ง์ง๋ง์ '๐'๋ผ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง ๋
ธ๋๊ฐ ์ถ๊ฐ๋จ
// my name is syong ๐
ํ(queue)
๋ ๋ฐ์ดํฐ๋ฅผ ๋์์๋ง ์ฝ์
ํ ์ ์๊ณ , ์์์๋ง ์ญ์ ํ ์ ์๋ ํญ๋ชฉ๋ค์ ๋ฆฌ์คํธ๋ฅผ ๋งํ๋ค.
๋ฐฐ์ด(Array)
์ ํ์ ๊ธฐ๋ฐ์ผ๋ก ์ฌ์ฉํ๋ฉด,
(๋งจ ๋) ์ฝ์
์ ํจ์จ์ฑ์ O(1)์ด ๋๊ณ , (๋งจ ์) ์ญ์ ์ ํจ์จ์ฑ์ O(N)์ด ๋๋ค.
์ฐ๊ฒฐ ๋ฆฌ์คํธ(Linked List)
๋ฅผ ํ์ ๊ธฐ๋ฐ์ผ๋ก ์ฌ์ฉํ๋ฉด,
(๋งจ ๋) ์ฝ์
์ ํจ์จ์ฑ์ O(N)์ด ๋๊ณ , (๋งจ ์) ์ญ์ ์ ํจ์จ์ฑ์ O(1)์ด ๋๋ค.
ํํธ, ์ด์ค ์ฐ๊ฒฐ ๋ฆฌ์คํธ(Doubly Linked List)
๋ฅผ ํ์ ๊ธฐ๋ฐ์ผ๋ก ์ฌ์ฉํ๋ฉด,
(๋งจ ๋) ์ฝ์
๊ณผ (๋งจ ์) ์ญ์ ์ ํจ์จ์ฑ์ด ๋ชจ๋ O(1)์ด ๋๋ค.
// ๐ก ๋
ธ๋ class
class Node {
constructor (data) {
this.data = data;
this.next_node = null;
this.prev_node = null;
}
}
// ๐ก ์ด์ค ์ฐ๊ฒฐ ๋ฆฌ์คํธ class
class DoublyLinkedList {
constructor (first_node = null, last_node = null) {
this.first_node = first_node;
this.last_node = last_node;
}
// ๋งจ ๋์ ์ฝ์
insert_at_end(value) {
const new_node = new Node(value);
if (!this.first_node) {
this.first_node = new_node;
this.last_node = new_node;
} else {
new_node.prev_node = this.last_node;
this.last_node.next_node = new_node;
this.last_node = new_node;
}
}
// ๋งจ ์์์ ์ญ์
remove_at_front() {
const remove_node = this.first_node;
this.first_node = this.first_node.next_node;
return remove_node;
}
}
// ๐ก ํ class
class Queue {
constructor () {
this.queue = new DoublyLinkedList(); // = ์ด์ค ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ฅผ ํ์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ค๋ ๋ป
}
enque(value) {
this.queue.insert_at_end(value);
}
deque(value) {
const remove_node = this.queue.remove_at_front(value);
return remove_node.data;
}
tail() {
return this.queue.last_node.data;
}
}
const queue = new Queue(); // ์ดํ์ ์๋ฌด๊ฒ๋ ์ฝ์
์ ํ๋ฉด, ์ฒ์๊ณผ ๋ง์ง๋ง ๋
ธ๋ ๋ชจ๋ ๊ธฐ๋ณธ๊ฐ null
queue.enque('์ฒซ ๋ฒ์งธ๋ก ์ฝ์
');
queue.enque('๋ ๋ฒ์งธ๋ก ์ฝ์
');
queue.enque('์ธ ๋ฒ์งธ๋ก ์ฝ์
');
console.log(queue);
// Queue {queue: DoublyLinkedList}
// ์ฒซ ๋ฒ์งธ๋ก ์ฝ์
๋ ๋ฒ์จฐ๋ก ์ฝ์
์ธ ๋ฒ์จฐ๋ก ์ฝ์
const remove_data = queue.deque();
console.log(remove_data); // ์ฒซ ๋ฒ์งธ๋ก ์ฝ์
โ โต ๋ฌด์กฐ๊ฑด ์ฒ์ ๋
ธ๋๊ฐ ์ญ์ ๋จ
ํ๋ก๊ทธ๋๋จธ์ค ๋ฌธ์ ํ์ด
์ฑ ๊ณ์ ์ฝ๊ธฐ