0) ์ถ์์ ์๋ฃ๊ตฌ์กฐ(ADT)
์๋ฃ๊ตฌ์กฐ์ ๋ด๋ถ๊ตฌํ์ ์ ๊ณตํ์ง ์๊ณ , ๋ฐ์ดํฐ์ ํํ๋ฅผ ์ ์ธํ๊ณ ๊ธฐ๋ฅ(์ฐ์ฐ)์ ์ ์ํ๋ ๊ฒ
1) ์ฐ๊ฒฐ๋ฆฌ์คํธ๋?
๋ ธ๋์ ๋ ธ๋๊ฐ ์ฐ๊ฒฐ๋ ํํ์ด๋ค.
๋ ธ๋๋ ๊ฐ์ ๋ด๋ ๋ถ๋ถ๊ณผ ์ฃผ์๋ฅผ ๋ด๋ ๋ถ๋ถ์ผ๋ก ๊ตฌ์ฑ๋์ด ์๋ค.
์ผ๋ฐ ๋ฆฌ์คํธ์ ๋นํด ๊ฐ์ ์ ๊ทผํ๋ ๋ฐ๋ ์ค๋ ๊ฑธ๋ฆฌ์ง๋ง(์๊ฐ๋ณต์ก๋ : O(1) vs O(n)), ๋ฐ์ดํฐ๋ฅผ ์์ ๋กญ๊ฒ ์ฝ์ ์ญ์ ํ ์ ์๋ค๋ ์ฅ์ ์ด ์๋ค.
์ค๋ ์ดํด๋ณผ ์ฐ๊ฒฐ๋ฆฌ์คํธ๋ ๊ธฐ๋ณธ ์ฐ๊ฒฐ๋ฆฌ์คํธ, head๊ฐ ๋๋ฏธ๋ ธ๋๋ฅผ ๊ฐ๋ฆฌํค๋ ์ฐ๊ฒฐ๋ฆฌ์คํธ, ์๋ฐฉํฅ ์ฐ๊ฒฐ๋ฆฌ์คํธ์ด๋ค.
๐ฅ๊ธฐ๋ณธ ์ฐ๊ฒฐ๋ฆฌ์คํธ
์ฐ๊ฒฐ๋ฆฌ์คํธ๋ ๋ ธ๋๊ฐ ์ฐ๊ฒฐ๋ ํํ์ด๋ฉฐ, head, tail, nodeCount๋ก ๊ตฌ์ฑ๋๋ค.
- Head : ์ ์ผ ์ ๋ ธ๋๋ฅผ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ
- Tail : ์ ์ผ ๋ท ๋ ธ๋๋ฅผ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ
- nodeCount : ์ฐ๊ฒฐ๋ฆฌ์คํธ์ ์๋ ๋ ธ๋์ ๊ฐ์
์ฐ์ฐ
์ฐ๊ฒฐ๋ฆฌ์คํธ๋ ๋ค์๊ณผ ๊ฐ์ ์ฐ์ฐ์ด ์ ๊ณต๋๋ค.
- ํน์ ์์ ์ฐธ์กฐ - getAt(pos) : pos๋ฒ์งธ ๋ ธ๋๋ฅผ ๋ฐํํ๋ค.
- ๋ฆฌ์คํธ ์ํ - traverse() : LinkedList์ ๋ชจ๋ ๋ ธ๋ ๊ฐ์ ๋ฐํํ๋ค.
- ๊ธธ์ด ์ป์ด๋ด๊ธฐ - getLength() : LinkedList์ ๋ ธ๋ ๊ฐ์๋ฅผ ๋ฐํํ๋ค.
- ์์ ์ฝ์ - insertAt(pos, newNode) : pos๋ฒ์งธ์ newNode๋ฅผ ์ฝ์ ํ๋ค.
- ์์ ์ญ์ - popAt(pos) : pos๋ฒ์งธ ๋ ธ๋๋ฅผ ์ญ์ ํ๊ณ ๊ฐ์ ๋ฐํํ๋ค.
- ๋ ๋ฆฌ์คํธ ํฉ์น๊ธฐ - concat(L) : LinkedList๋ค์ L์ ํฉ์ณ ๋ฐํํ๋ค.
ํด๋์ค ๋ค์ด์ด๊ทธ๋จ
๋ฐ์ดํฐ์ ํํ์ ๊ธฐ๋ฅ์ ํฉ์น ํด๋์ค ๋ค์ด์ด๊ทธ๋จ์ ๋ค์๊ณผ ๊ฐ๋ค.
์ฐ์ฐ์ ๋ณด๋ฉด ๋งจ ์๊ณผ ์ฐ๊ด๋ ๋ ธ๋์ ๊ฒฝ์ฐ ์ฐ์ฐ์ ๋ฐ๋ก ์ฒ๋ฆฌํด์ผ ํ๋ค.
head๊ฐ ๋๋ฏธ ๋ ธ๋(๋น ๋ ธ๋)๋ฅผ ๊ฐ๋ฆฌํค๊ฒ ํ์ฌ ์ฐ์ฐ์ ๊ฐ๋จํ๊ฒ ํด ๋ณด์.
โ๏ธ๋๋ฏธ ์ฐ๊ฒฐ๋ฆฌ์คํธ
head ํฌ์ธํฐ๊ฐ dummy node๋ฅผ ๊ฐ๋ฆฌํค๋๋ก ํ๋ ํํ์ด๋ค.
์ฐ์ฐ
ํด๋น ์ฐ๊ฒฐ๋ฆฌ์คํธ์ ์ฐ์ฐ์ ์ข ๋ฅ๋ ๊ธฐ๋ณธ์ฐ๊ฒฐ๋ฆฌ์คํธ์ ๊ฐ๋ค.
- ํน์ ์์ ์ฐธ์กฐ - getAt(pos) : pos๋ฒ์งธ ๋ ธ๋๋ฅผ ๋ฐํํ๋ค.
- ๋ฆฌ์คํธ ์ํ - traverse() : LinkedList์ ๋ชจ๋ ๋ ธ๋ ๊ฐ์ ๋ฐํํ๋ค.
- ๊ธธ์ด ์ป์ด๋ด๊ธฐ - getLength() : LinkedList์ ๋ ธ๋ ๊ฐ์๋ฅผ ๋ฐํํ๋ค.
- ์์ ์ฝ์ - insertAt(pos, newNode) : pos๋ฒ์งธ์ newNode๋ฅผ ์ฝ์ ํ๋ค.
- ์์ ์ญ์ - popAt(pos) : pos๋ฒ์งธ ๋ ธ๋๋ฅผ ์ญ์ ํ๊ณ ๊ฐ์ ๋ฐํํ๋ค.
- ๋ ๋ฆฌ์คํธ ํฉ์น๊ธฐ - conccat(L) : LinkedList๋ค์ L์ ํฉ์ณ ๋ฐํํ๋ค.
+ ์ฝ์ , ์ญ์ ์ฐ์ฐ์ ์ฅ์ ์ ๊ทน๋ํํ๊ธฐ ์ํด ์๋ ๋ ๊ฐ์ง ํจ์๋ฅผ ์ถ๊ฐํ์ฌ ์ฐ์ฐ์ ๊ฐ๋จํ ํด ๋ณด์.
- insertAfter(prev, newNode)
- popAfter(prev)
์ผ๋ฐ ๋ฐฐ์ด์ ์ธ๋ฑ์ค๋ฅผ ์ด์ฉํด ๊ฐ์ ์ฐพ๊ธฐ ๋๋ฌธ์ ์์๋ฅผ ์ฐธ์กฐํ ๋์์๊ฐ๋ณต์ก๋๊ฐ O(1)์ด๋ค.
๋ฐ๋ฉด, ์ฐ๊ฒฐ๋ฆฌ์คํธ๋ ์์์๋ถํฐ ์์๋๋ก ๊ฐ์ ์ฐพ์ ๋๊ฐ์ผ ํ๊ธฐ ๋๋ฌธ์ ์๊ฐ๋ณต์ก๋๊ฐ O(n)์ด๋ค.
๊ธฐ๋ณธ ์ฐ๊ฒฐ๋ฆฌ์คํธ๋, ๋๋ฏธ๋ ธ๋๋ฅผ ํฌํจํ ์ฐ๊ฒฐ๋ฆฌ์คํธ ๋ชจ๋ ๋ค์ ๋ ธํธ๋ก ์ฐ๊ฒฐ๋์ด ์์ง๋ง, ์ด์ ๋ ธ๋๋ก๋ ๋์๊ฐ์ง ๋ชปํ๋ ๋จ์ ์ด ์๋ค. ์ด ๋๋ฌธ์ ์ผ๋ฐ ๋ฆฌ์คํธ์ ๋นํด ์๊ฐ ๋ณต์ก๋๊ฐ ํฐ๋ฐ, ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์๋ฐฉํฅ ์ฐ๊ฒฐ๋ฆฌ์คํธ์ ๋ํด ์๊ฐํด ๋ณด์.
P : ๋ค์๋ ธ๋๋ก ์ด๋ํ ์ ์์ง๋ง ์ด์ ๋ ธ๋๋ก ๋์๊ฐ์ง ๋ชปํจ
S : ์๋ฐฉํฅ ์ฐ๊ฒฐ๋ฆฌ์คํธ
๐ด์๋ฐฉํฅ ์ฐ๊ฒฐ๋ฆฌ์คํธ
node์ prevํฌ์ธํฐ๋ฅผ ์ถ๊ฐํ๋ค.
LinkedList์ head, tail ํฌ์ธํฐ๊ฐ ๋๋ฏธ ๋ ธ๋๋ฅผ ๊ฐ๋ฆฌํค๊ฒ ํ๋ค.
์ด๋ ๊ฒ ๋งํฌ๋๋ฆฌ์คํธ๋ฅผ ๊ตฌํํ๋ฉด ๋ฐ์ดํฐ๋ฅผ ๋ด๊ณ ์๋ ๋ ธ๋๋ค์ ๋ชจ๋ ๊ฐ์ ๋ชจ์์ด๋ฏ๋ก ์ฐ์ฐ์ด ๊ฐ๋จํด์ง๋ค.
ํ์ง๋ง, ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ ์ฐจ์งํ๋ ๋จ์ ์ด ์๋ค.
ํด๋์ค ๋ค์ด์ด๊ทธ๋จ
๋ฐ์ดํฐ์ ํํ์ ๊ธฐ๋ฅ์ ํฉ์น ํด๋์ค ๋ค์ด์ด๊ทธ๋จ์ ๋ค์๊ณผ ๊ฐ๋ค.
์ฐ์ฐ์ ์ข ๋ฅ๋ ๋๋ฏธ ๋งํฌ๋๋ฆฌ์คํธ์ ์ ์ฌํ๋ฏ๋ก ์๋ตํ๋ค.
head, tail ๋ชจ๋ ๋๋ฏธ ๋ ธ๋๋ฅผ ๊ฐ๋ฆฌํค๋ฏ๋ก ์ฐ์ฐ ์ ๋ณ๋์ ์ฒ๋ฆฌ๋ฅผ ๋ ์ํ๋ค.
๊ฒฐ๋ก ) ์๋ฐฉํฅ ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋, ๊ณต๊ฐ๋ณต์ก๋๊ฐ ์กฐ๊ธ ์ฆ๊ฐํ๋ ๋จ์ ์ด ์์ง๋ง, ๊ตฌํ์ด ํธ๋ฆฌํ๋ฏ๋ก ์์ฃผ ์ฌ์ฉ๋๋ค.
์ฐ๊ฒฐ๋ฆฌ์คํธ์ ๋ชจ๋ ํจ์ ๊ตฌํ์ ๊นํ๋ธ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ์.
๊ด๋ จ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
from doublylinkedlist import Node
from doublylinkedlist import DoublyLinkedList