Today, What I learned?
์ด์ ์ ์ด์ด์ ์๊ณ ๋ฆฌ์ฆ ๊ณต๋ถ๋ฅผ ๊ณ์!...
์๋ฃ๊ตฌ์กฐ ์ค ์ฐ๊ฒฐ ๋ฆฌ์คํธ์ ๋ํด ์ ๋ฆฌํด๋ณด๊ณ ๊ตฌํํด๋ณด๋ ์๊ฐ์ ๊ฐ์ก๋ค.
ํํฐ๋์ ์๊ณ ๋ฆฌ์ฆ๊ณผ ์๋ฃ๊ตฌ์กฐ์ ๋ํ ์ฝ๋ฉํธ์ ์ฐ๊ฒฐ ๋ฆฌ์คํธ์ ๋ํด ์ ๋ฆฌํด๋ณด๋ ค ํ๋ค. ๐
์๊ฐ ๋ณต์ก๋์ ๊ณต๊ฐ ๋ณต์ก๋
์๊ฐ ๋ณต์ก๋์ ๊ด๋ จํด์๋ ์์ ์ ๋ธ๋ก๊น ์ ํ ์ ์ด ์๋ค.
์๊ณ ๋ฆฌ์ฆ์์๋ ์ด์ ๊ณต๊ฐ๋ณต์ก๋๋ณด๋ค ์๊ฐ ๋ณต์ก๋๋ฅผ ๋ ํ์์ ์ผ๋ก ์ฑ๊ฒจ์ผ ํ๋๋ฐ,
๊ณต๊ฐ ๋ณต์ก๋๋ ๋ฐ์ดํฐ์ ํฌ๊ธฐ๊ฐ ํจ์ฌ ์ค์ํด์, ๋ฆฌ์์ค๋ฅผ ์ผ๋ง๋ ์ก์๋จน๋๋? ์ ๋ฌธ์ ๋ค.
๋ฌผ๋ก ๊ณต๊ฐ ๋ณต์ก๋๋ ๋ฎ์์๋ก ์ข๋ค!
์๋ฃ๊ตฌ์กฐ๋ฅผ ์ด๋ค ๊ฒ์ ๊ธฐ์ค์ผ๋ก ์ ํํด์ผ ํ ๊น?
์๋ฃ๊ตฌ์กฐ๋ฅผ ์ ํํ ๋ ๊ณ ๋ คํด์ผ ํ ์์๋ ๋ค ๊ฐ์ง ์ ๋๊ฐ ์๋ค.
1. ์ฝ์ ์๊ฐ
2. ์ญ์ ์๊ฐ
3. ๊ฒ์์๊ฐ
4. ์ ๋ ฌ ์ฌ๋ถ
์๋ฃ๊ตฌ์กฐ๋ ๋ฐ์ดํฐ๋ฅผ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ๊ณ ๊ด๋ฆฌํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์, ์ฐ์ ์์๋ฅผ ๋ฐ์ ธ์ ์ ์ ํ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ ํํ๋ ๊ฒ์ด ์ข์ ๊ฒ์ด๋ค! ๐
์ฐ๊ฒฐ ๋ฆฌ์คํธ Linked List
์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ O(N)์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ง๊ณ ์๊ณ , ๋ฐฐ์ด(Array)๊ณผ ํจ๊ป ๋น๊ต๊ฐ ๋ง์ด ๋๋ค.
ํฌ๊ธฐ๊ฐ ๊ณ ์ ์ด ๋์ด์๋ ๋ฐฐ์ด๊ณผ ๋ค๋ฅด๊ฒ ์ ๋ค์ ํฌ์ธํฐ๋ฅผ ๋ณ๊ฒฝํด์ ์์๋ฅผ ์ ์ฐํ๊ฒ ์ฝ์ /์ญ์ ํ ์ ์๋ค.
์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ฅผ ๊ธฐ์ค์ผ๋ก ์ ๋ฆฌํด๋ณด๋ฉด ์ด๋ ๋ค.
- ํน์ ์์๋ฅผ ์กฐํํ ๋, ํด๋น ๋
ธ๋๊น์ง ํ์ํด์ผ ํ๊ธฐ ๋๋ฌธ์ ์๊ฐ ๋ณต์ก๋๋ O(N)์ด๋ค.
- ๋ฐฐ์ด์ ์ธ๋ฑ์ค๋ก ๋ฐ๋ก ์กฐํ๊ฐ ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ O(1)
- ์ค๊ฐ์ ์ฝ์
/์ญ์ ๊ฐ ์ด๋ฃจ์ด์ง ๋์ ์๊ฐ ๋ณต์ก๋๋ O(1)์ด๋ค.
- ๋ฐฐ์ด์ ๊ฒฝ์ฐ ๋ชจ๋ ์์๋ฅผ ์ฎ๊ฒจ์ผ ํ๋ ๊ฒฝ์ฐ๋ ์๊ธฐ ๋๋ฌธ์ O(N)
- ๋ชจ๋ ๊ณต๊ฐ์ด ๋ค ์ฐผ์ด๋ ๋ ธ๋๋ฅผ ๋์ ์ผ๋ก ์ถ๊ฐํ ์ ์๋ค.
๋ฐ๋ผ์ ๋ฐ์ดํฐ์ ์ฝ์ ๊ณผ ์ญ์ ๊ฐ ๋ง์ ๊ฒฝ์ฐ๋ผ๋ฉด ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ฅผ ์ฐ๋ ๊ฒ์ด ์ข์ผ๋ฉฐ, ๋ฐ์ดํฐ์ ์ ๊ทผํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ ๊ฒฝ์ฐ๋ผ๋ฉด ๋ฐฐ์ด์ ์ฐ๋ ๊ฒ์ด ๋ ์ ํฉํ๋ค.
์๋ฐ์คํฌ๋ฆฝํธ๋ก ์ฐ๊ฒฐ ๋ฆฌ์คํธ ๊ตฌํํ๊ธฐ
์๋ฐ์คํฌ๋ฆฝํธ๋ก ์ฐ๊ฒฐ ๋ฆฌ์คํธ์ ๋ช ๊ฐ์ง ํจ์๋ฅผ ๊ตฌํํด๋ณด์๋ค.
๊ตฌํํ ๊ฒ์ ๋จ๋ฐฉํฅ ์ฐ๊ฒฐ ๋ฆฌ์คํธ!
Node
class Node {
constructor(data) {
this.data = data;
this.next = null;
}
}
์ฐ์ ๋
ธ๋ ํด๋์ค.
์ด๊ธฐ๊ฐ์ผ๋ก ๋ค์ ๋
ธ๋๊ฐ ์๊ธฐ ๋๋ฌธ์ null ๊ฐ์ ๋ฃ๋๋ค.
Linked List
class LinkedList {
constructor() {
this.head = null;
this.tail = null;
this.size = 0;
}
}
์ด๊ธฐ ์ฐ๊ฒฐ ๋ฆฌ์คํธ ํด๋์ค.
๋งจ ์, ๋งจ ๋ค๋ฅผ ๋ํ๋ด๋ head์ tail. ๊ธธ์ด๋ฅผ ๋ํ๋ด๋ size ๋ชจ๋ ์ด๊ธฐ๊ฐ์ด๋ค.
append()
append(data) {
let node = new Node(data);
this.tail.next = node; // ๋ง์ง๋ง ๋
ธ๋์ ์๋ก์ด ๋
ธ๋ ์ถ๊ฐ!
this.tail = node; // ์ ์ฒด ๋ฆฌ์คํธ์ ๋ง์ง๋ง ์ค์
this.size += 1;
}
๋ง์ง๋ง์ ์๋ก์ด ๋
ธ๋๋ฅผ ์ถ๊ฐํ๋ append ํจ์
ํ์ฌ ๋ง์ง๋ง ๋
ธ๋์ ํฌ์ธํฐ๋ฅผ ์๋ก ์์ฑ๋ ๋
ธ๋๋ก ํฅํ๊ฒ ๋ง๋ ๋ค.
๋ง์ง๋ง ๋
ธ๋๋ฅผ ์๋ก์ด ๋
ธ๋๋ก ์ง์ ํ๊ณ ์ ์ฒด ์ฌ์ด์ฆ๋ฅผ ํ๋ ๋๋ ค์ ์ถ๊ฐ ๋ง๋ฌด๋ฆฌ.
toString()
toString() {
for (let node = this.head; node != null; node = node.next) {
console.log(`${node.data} -> `);
}
}
๋ชจ๋ ๋
ธ๋๋ฅผ ์ถ๋ ฅํ๊ธฐ ์ํ toString ํจ์.
์ถ๋ ฅ์ ์ํ ๋ฐฉ๋ฒ์ ์ฌ๋ฌ ๊ฐ์ง์ง๋ง, ๋๋ for๋ฌธ์ ํตํด ๋
ธ๋๋ฅผ ๋ง์ง๋ง ๋
ธ๋๊น์ง ์ด๋ํด๊ฐ๋ฉฐ ์ถ๋ ฅํ๋ ๋ฐฉ๋ฒ์ ์ ํํ๋ค.
insert()
insert(position = 0, data) {
if (position < 0 || position > this.size) {
return false;
}
let node = new Node(data);
let curr = this.head;
let prev,
index = 0;
if (position === 0) {
node.next = curr;
this.head = node;
} else {
while (index++ < position) {
prev = curr;
curr = curr.next;
}
}
node.next = curr; // ์๋ก์ด ๋
ธ๋์ next๋ฅผ ๋ค์ ๋
ธ๋๋ก ์ง์ (์ค๊ฐ์ ๋ผ์ด๋ ์ํ)
prev.next = node; // ํ์ฌ ๋
ธ๋๋ฅผ ์๋ก์ด ๋
ธ๋์ ๊ฐ๋ฆฌ์ผ์ ์ค๊ฐ์ ๋ผ์ด๋ ๊ฒ ๋ง๋ฌด๋ฆฌ
this.size++;
return true;
}
์ํ๋ ์์น์ ๊ฐ์ ์ถ๊ฐํ๋ insert ํจ์.
insert ๋๋ ๊ณผ์ ์ ์ดํดํ๋๋ฐ ์๊ฐ์ด ์ข ๊ฑธ๋ ธ๋ค. ๐
๋จผ์ ํด๋น ์์น๊ฐ ์ฌ๋ฐ๋ฅธ ๊ฐ์ด ์๋ ๊ฒฝ์ฐ์ ๋ํ ์๋ฌ ์ฒ๋ฆฌ๋ฅผ ํด์ฃผ์๋ค.
์ํ๋ ์์น๊ฐ 0์ผ ๊ฒฝ์ฐ์๋ ๋ฐ๋ก ์๋ก์ด ๋
ธ๋๋ฅผ ์ถ๊ฐํ ์ ์๋๋ก ํ๊ณ ,
์๋ ๊ฒฝ์ฐ์๋ ํด๋น ์์น๊น์ง ์ด๋์ ํ๋๋ฐ ์ด๋ prev
๋ผ๋ ๋ณ์์ ํ์ฌ ๋
ธ๋๋ฅผ ๋ด์๊ฐ๋ฉฐ ์ด๋ํ๋ค.
์ํ๋ ์์น์ ๋์ฐฉํ์ ๋, ์๋ก์ด ๋ ธ๋์ ํฌ์ธํฐ๋ฅผ ๋ผ์ด๋ค ์์น์ ๋ค์ ๋ ธ๋๋ฅผ ํฅํ๊ฒ ํ๋ค.
๊ทธ๋ฆฌ๊ณ ๊ธฐ์กด ๋ ธ๋์ ํฌ์ธํฐ๊ฐ ์๋ก์ด ๋ ธ๋๋ฅผ ๊ฐ๋ฆฌํค๋๋ก ํ๋ค.
๊ทธ๋ผ ์ถ๊ฐ ์.
removeAt()
removeAt(position = 0) {
if (position < 0 || position >= this.size) {
return false;
}
let current = this.head;
let index = 0;
let prev;
if (position === 0) {
this.head = current.next;
} else {
while (index++ < position) {
prev = current;
current = current.next;
}
prev.next = current.next; // ์ด์ ๋
ธ๋๊ฐ ๋ค์ ๋
ธ๋ ๊ฐ๋ฆฌํค๋๋ก ํจ
}
this.length--;
}
์ํ๋ ์์น์ ๋
ธ๋๋ฅผ ์ญ์ ํ๋ removeAt ํจ์.
์์น์ ๋ํ ์๋ฌ ์ฒ๋ฆฌ์ ํด๋น ๋
ธ๋๋ฅผ ํ์ํ๋ ๊ณผ์ ์ ์์ ๋์ผํ๋ค.
๋ค๋ง ์ญ์ ํ ๋๋ ์ญ์ ํ๋ ค๋ ๋
ธ๋๋ฅผ current
๋ผ๊ณ ํ์ ๋,
์ด์ ๋
ธ๋์ ํฌ์ธํฐ๊ฐ current
์ ๋ค์ ๋
ธ๋๋ฅผ ํฅํ๋๋ก ํ๋ค.
๋ ์ด์ head๋ก๋ถํฐ ํ์์ด ๋ถ๊ฐ๋ฅํ๊ฒ ๋ 62๋ ์์ฐ์ค๋ ์ญ์ !..
์ด์ ์ด๊ฑธ ๊ธฐ๋ฐ์ผ๋ก ์ฌ๋ฌ ํจ์๋ฅผ ์ง ๋ณผ ์ ์๊ฒ ์ง๋ง ์ค๋์ ์ด๋งํผ ์ดํดํ๊ธฐ๋ ๋ฒ ์ฐจ๋ค ๋ฒ ์ฐจ ๐...
์ฐ๊ฒฐ ๋ฆฌ์คํธ ๋ฌธ์ ๋ฅผ ์กฐ๊ธ์ด๋๋ง ๊ฑด๋๋ ค๋ณผ ์ ์๊ธฐ๋ฅผ ํฌ๋งํ๋ฉฐ ์ค๋ TIL์ ๋ง์น๋ค!.. ๐
'๐ Studying > ๐ TIL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
TIL : ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ, display:table ์์ฑ (0) | 2022.11.14 |
---|---|
TIL : CPU, ์ด์งํ์, ์ฌ๊ทํจ์ (0) | 2022.11.11 |
TIL : ๋ฌธ์ฅ ๋ด ์ํ๋ฒณ ์ต๋ ๋น๋์ ๊ตฌํ๊ธฐ (1) | 2022.11.09 |
TIL : ํ์ด์ฌ ๋ฌธ๋ฒ, JS ๋๋ง์๊ธฐ ๊ฒ์ (0) | 2022.11.08 |
[JavaScript] null, undefined, undeclared์ ์ฐจ์ด์ , ๊ฐ์ฒด ๋ฆฌํฐ๋ด (0) | 2022.11.07 |
Comment