๐Ÿ–ฅ๏ธ CS/์ž๋ฃŒ๊ตฌ์กฐ

๊ทธ๋ž˜ํ”„(Graph)๊ทธ๋ž˜ํ”„๋Š” ๋…ธ๋“œ์™€ ๊ฐ„์„ ์˜ ์ง‘ํ•ฉ์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค.๊ฐ์ฒด ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ์„ ์œผ๋กœ ์—ฐ๊ฒฐํ•˜์—ฌ ํ‘œํ˜„ํ•˜๋Š” ํ˜•ํƒœ๋กœ, ๊ฐ ์ •์  ๊ฐ„์—๋Š” ๋ถ€๋ชจ-์ž์‹ ๊ด€๊ณ„๊ฐ€ ์—†๋‹ค.๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰(BFS), ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰(DFS) ์•Œ๊ณ ๋ฆฌ์ฆ˜์—์„œ ๊ทธ๋ž˜ํ”„๋ฅผ ์ˆœํšŒํ•˜๋Š” ๋ฐฉ์‹์—์„œ ์‚ฌ์šฉํ•œ๋‹ค. ๊ทธ๋ž˜ํ”„์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์šฉ์–ด๋…ธ๋“œ/์ •์ (Vertex): ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋˜๋Š” ๊ธฐ๋ณธ ๊ฐ์ฒด๊ฐ„์„ (Edge): ์ •์ ์„ ์—ฐ๊ฒฐํ•˜๋Š” ์„ ์ธ์ ‘ ์ •์ : ๊ฐ„์„ ์— ์˜ํ•ด ์ง์ ‘ ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ๋กœ, ํ•œ ์ •์ ์—์„œ ๊ฐ„์„ ์„ ํ•œ ๋ฒˆ์— ๊ฐˆ ์ˆ˜ ์žˆ๋‹ค๋ฉด ํ•ด๋‹น ์ •์ ๋“ค์€ ์ธ์ ‘ํ•˜๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.๋‹จ์ˆœ ๊ฒฝ๋กœ: ๊ฒฝ๋กœ ์ค‘์—์„œ ๋ฐ˜๋ณต๋˜๋Š” ์ •์ ์ด ์—†๋Š” ๊ฒฝ์šฐ ๊ทธ๋ž˜ํ”„ ์ข…๋ฅ˜๋ฌด๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„๋ชจ๋“  ๊ฐ„์„ ์ด ์–‘๋ฐฉํ–ฅ์ธ ๊ทธ๋ž˜ํ”„๋กœ, ๋ฐฉํ–ฅ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ์–‘์ชฝ์˜ ๋ฐฉํ–ฅ ๋ชจ๋‘ ์ด๋™์ด ๊ฐ€๋Šฅํ•˜๋‹ค.๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„๊ฐ„์„ ๋“ค์˜ ๋ฐฉํ–ฅ์ด ์กด์žฌํ•˜๋Š” ๊ทธ๋ž˜ํ”„๋กœ, ..
ํž™(Heap) ์™„์ „ ์ด์ง„ ํŠธ๋ฆฌ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ์ž๋ฃŒ๊ตฌ์กฐ๋กœ, ์ตœ๋Œ€๊ฐ’๊ณผ ์ตœ์†Œ๊ฐ’์„ ๋น ๋ฅด๊ฒŒ ์ฐพ๊ธฐ ์œ„ํ•ด ๋งŒ๋“ค์–ด์กŒ๋‹ค. ๋ฐ˜์ •๋ ฌ ์ƒํƒœ(๋А์Šจํ•œ ์ •๋ ฌ ์ƒํƒœ)๋ฅผ ์œ ์ง€ํ•œ๋‹ค. ์ฆ‰, ๋ชจ๋“  ๋…ธ๋“œ๊ฐ€ ์ •๋ ฌ๋˜์–ด ์žˆ๋Š” ๊ฑด ์•„๋‹ˆ๋ผ๋Š” ์˜๋ฏธ์ด๋‹ค. ๋ถ€๋ชจ ๋…ธ๋“œ์™€ ์ž์‹ ๋…ธ๋“œ ๊ฐ„์˜ ๋Œ€์†Œ ๊ด€๊ณ„๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ตฌ์„ฑํ•œ๋‹ค. ์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ์™€ ๋‹ฌ๋ฆฌ ์™ผ์ชฝ, ์˜ค๋ฅธ์ชฝ ์ž์‹ ๋…ธ๋“œ ๊ฐ„์˜ ํฌ๊ธฐ๋Š” ์ƒ๊ด€์ด ์—†๋‹ค. ํž™์€ ์ค‘๋ณต ๊ฐ’์ด ํ—ˆ์šฉ๋œ๋‹ค. ํž™์€ ๋Œ€๋Ÿ‰์˜ ์ตœ๋Œ€๊ฐ’์ด๋‚˜ ์ตœ์†Œ๊ฐ’์„ ๋น ๋ฅด๊ฒŒ ์ฐพ์•„์•ผํ•  ๋•Œ ๋งค์šฐ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉ๋œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์šฐ์„ ์ˆœ์œ„ ํ๋ฅผ ๊ตฌํ˜„ํ•˜๊ฑฐ๋‚˜, ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋“ฑ์˜ ๊ทธ๋ž˜ํ”„ ์•Œ๊ณ ๋ฆฌ์ฆ˜์—์„œ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ์ฐพ์„ ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค. ์™„์ „ ์ด์ง„ ํŠธ๋ฆฌ(Complete Binary Tree) ์™ผ์ชฝ์—์„œ๋ถ€ํ„ฐ ์ฑ„์›Œ์ ธ ์žˆ๋Š” ์ด์ง„ ํŠธ๋ฆฌ ๋งˆ์ง€๋ง‰ ๋ ˆ๋ฒจ์„ ์ œ์™ธํ•˜๊ณ ๋Š” ๋ชจ๋“  ๋ ˆ๋ฒจ์ด ์ฑ„์›Œ์ ธ ์žˆ๋Š” ํ˜•ํƒœ ๋งˆ์ง€..
์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ(Binary Search Tree) ์ด์ง„ ํƒ์ƒ‰๊ณผ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ฒฐํ•จํ•œ ์ž๋ฃŒ๊ตฌ์กฐ์˜ ์ผ์ข…์œผ๋กœ, ํƒ์ƒ‰ ์ž‘์—…์„ ํšจ์œจ์ ์œผ๋กœ ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ์˜ ํŠน์ง• ์ด์ง„ ํŠธ๋ฆฌ ๊ตฌ์กฐ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค. ๋…ธ๋“œ์˜ ์™ผ์ชฝ ์„œ๋ธŒ ํŠธ๋ฆฌ์—๋Š” ๋…ธ๋“œ ๊ฐ’๋ณด๋‹ค ์ž‘์€ ๊ฐ’์ด ํฌํ•จ๋˜์–ด ์žˆ๊ณ , ์˜ค๋ฅธ์ชฝ ์„œ๋ธŒ ํŠธ๋ฆฌ์—๋Š” ๋…ธ๋“œ ๊ฐ’๋ณด๋‹ค ํฐ ๊ฐ’์ด ํฌํ•จ๋˜์–ด ์žˆ๋‹ค. ์„œ๋ธŒ ํŠธ๋ฆฌ ๋˜ํ•œ ์ด์ง„ ํƒ์ƒ‰ ๊ตฌ์กฐ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค. ๋ชจ๋“  ์›์†Œ์˜ ํ‚ค๋Š” ์œ ์ผํ•œ ํ‚ค๋ฅผ ๊ฐ€์ง„๋‹ค. (์ค‘๋ณต ๊ฐ’์ด ์—†๋‹ค.) ์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ  ํŠธ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋น ๋ฅด๊ฒŒ ํƒ์ƒ‰ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค. ์„ ํ˜• ์ž๋ฃŒ๊ตฌ์กฐ์—์„œ๋Š” ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ ๋’ค์— ์˜ค์ง ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ๋งŒ ์กด์žฌํ•œ๋‹ค. ๋•Œ๋ฌธ์— ํŠน์ • ๊ฐ’์„ ํƒ์ƒ‰ํ•  ๋•Œ ๋งจ ๋๊นŒ์ง€ ์ˆœ์ฐจ์ ์œผ๋กœ ํƒ์ƒ‰ํ•˜๋Š” ์ตœ์•…์˜ ๊ฒฝ์šฐ์— ์‹œ๊ฐ„ ๋ณต์žก๋„๊ฐ€ O(n)..
ํŠธ๋ฆฌ (Tree) ๋…ธ๋“œ(Node)์™€ ๊ฐ„์„ (Edge)๋กœ ์ด๋ฃจ์–ด์ง„ ๋น„์„ ํ˜• ์ž๋ฃŒ๊ตฌ์กฐ ํŠธ๋ฆฌ์˜ ์šฉ์–ด ๊ตฌ๋ถ„ ์„ค๋ช… ๊ฐ„์„ (Edge) ๋‘ ๋…ธ๋“œ๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ์„ (๋งํฌ) ๋…ธ๋“œ(Node) ํŠธ๋ฆฌ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ธฐ๋ณธ ์›์†Œ ๋ฃจํŠธ ๋…ธ๋“œ(Root) ํŠธ๋ฆฌ์˜ ์ตœ ์ƒ์œ„ ๋…ธ๋“œ ๋ฆฌํ”„ ๋…ธ๋“œ(Leaf) ์ž์‹ ๋…ธ๋“œ๊ฐ€ ์—†๋Š” ๋…ธ๋“œ ํ˜•์ œ ๋…ธ๋“œ(Sibling) ๊ฐ™์€ ๋ถ€๋ชจ๋ฅผ ๊ฐ–๋Š” ๋…ธ๋“œ ๋…ธ๋“œ์˜ ํฌ๊ธฐ(Size) ์ž์‹ ์„ ํฌํ•จํ•œ ๋ชจ๋“  ์ž์‹ ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜ ๋…ธ๋“œ์˜ ๊นŠ์ด(depth) ๋ฃจํŠธ์—์„œ ์–ด๋–ค ๋…ธ๋“œ์— ๋„๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด ๊ฑฐ์ณ์•ผ ํ•˜๋Š” ๊ฐ„์„ ์˜ ์ˆ˜ ๋…ธ๋“œ์˜ ๋ ˆ๋ฒจ(Level) ํŠธ๋ฆฌ์˜ ํŠน์ • ๊นŠ์ด๋ฅผ ๊ฐ€์ง€๋Š” ๋…ธ๋“œ์˜ ์ง‘ํ•ฉ ๋…ธ๋“œ์˜ ์ฐจ์ˆ˜(Degree) ๊ฐ ๋…ธ๋“œ์˜ ์ž์‹ ๋…ธ๋“œ ๊ฐœ์ˆ˜ ํŠธ๋ฆฌ์˜ ์ฐจ์ˆ˜(Degree of Tree) ํŠธ๋ฆฌ์˜ ์ตœ๋Œ€ ์ฐจ์ˆ˜ ํŠธ๋ฆฌ์˜ ๋†’์ด(Height) ๋ฃจํŠธ ๋…ธ๋“œ์—์„œ ๊ฐ€์žฅ ๊นŠ์ˆ™์ด ์žˆ๋Š” ๋…ธ..
ํ(Queue) ๊ฐ€์žฅ ๋จผ์ € ๋“ค์–ด์˜จ ๊ฒƒ์ด ๊ฐ€์žฅ ๋จผ์ € ๋‚˜์˜ค๋Š” FIFO์˜ ํŠน์ง•์„ ๊ฐ€์ง€๋Š” ์ž๋ฃŒ๊ตฌ์กฐ Queue๋Š” ๋’ค(rear)์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ (enqueue), ์•ž(front)์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊บผ๋‚ธ๋‹ค(dequeue). Front: Queue์˜ ๊ฐ€์žฅ ์ฒซ ์›์†Œ Rear: Queue์˜ ๊ฐ€์žฅ ๋ ์›์†Œ removeFirst() Swift์—์„œ ๋ฐฐ์—ด์˜ ์ฒซ ๋ฒˆ์งธ ์›์†Œ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ๋ฐ˜ํ™˜ํ•ด์ฃผ๋Š” ์ธ์Šคํ„ด์Šค ๋ฉ”์†Œ๋“œ๊ฐ€ ์กด์žฌํ•œ๋‹ค. ํ•˜์ง€๋งŒ ๋‚˜๋จธ์ง€ ๋ฐฐ์—ด์˜ ์›์†Œ์˜ ์ž๋ฆฌ๋ฅผ ์ด๋™์‹œ์ผœ ๋นˆ ๊ณต๊ฐ„์„ ์—†์• ์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ O(n)์ด ๋œ๋‹ค. ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋กœ Queue ๊ตฌํ˜„ํ•˜๊ธฐ Node.swift class Node { let data: T var next: Node? init(data: T, next: Node? = nil) { self.data = ..
์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ(Linked List) ์—ฐ์†์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ์œ„์น˜์— ์ €์žฅ๋˜์ง€ ์•Š๋Š” ์„ ํ˜• ์ž๋ฃŒ๊ตฌ์กฐ ๋ฐ์ดํ„ฐ ํ•„๋“œ + ๋‹ค์Œ์˜ ๋…ธ๋“œ์— ๋Œ€ํ•œ ์ฐธ์กฐ ๋ฅผ ํฌํ•จํ•˜๋Š” ๋…ธ๋“œ๋กœ ๊ตฌ์„ฑ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ? ๋ฐฐ์—ด์€ ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๊ฐ€ ๊ณ ์ •๋˜์–ด ์žˆ์–ด ๋ฏธ๋ฆฌ ์š”์†Œ์˜ ์ˆ˜์— ๋Œ€ํ•ด ํ• ๋‹น๋ฐ›์•„์•ผ ํ–ˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์ƒˆ๋กœ์šด ์š”์†Œ ์‚ฝ์ž…์˜ ๋น„์šฉ์ด ๋งŽ์ด ๋“ ๋‹ค. (๊ณต๊ฐ„ ๋งŒ๋“ค๊ธฐ + ๊ธฐ์กด ์š”์†Œ์˜ ์ด๋™) ์žฅ์  ๋™์ ์ธ ํฌ๊ธฐ๋ฅผ ๊ฐ€์ง„๋‹ค. ์‚ฝ์ž…/์‚ญ์ œ๊ฐ€ ์šฉ์ดํ•˜๊ณ  ์†๋„๊ฐ€ ๋น ๋ฅด๋‹ค. ๋‹จ์  Random Access๊ฐ€ ๋ถˆ๊ฐ€ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ฒซ ๋ฒˆ์งธ ๋…ธ๋“œ๋ถ€ํ„ฐ ์ˆœ์ฐจ์ ์œผ๋กœ ์•ก์„ธ์Šคํ•ด์•ผํ•œ๋‹ค. ๊ฒ€์ƒ‰ ์†๋„๊ฐ€ ๋А๋ฆฌ๋‹ค. ์ €์žฅ ๊ณต๊ฐ„์˜ ํšจ์œจ์ด ๋†’์ง€ ์•Š๋‹ค. ์ถ”๊ฐ€(add) ๋…ธ๋“œ๊ฐ€ ์•„๋ฌด๊ฒƒ๋„ ์—†์„ ๋•Œ head = nil, tail = nil head ๊ฐ’์„ ํ™•์ธ ํ›„ ์ƒˆ๋กœ์šด ๋…ธ๋“œ๋ฅผ ์—ฐ๊ฒฐํ•˜๊ณ  tail๋„ ๋™์ผํ•˜๊ฒŒ ..
์Šคํƒ(Stack) ๊ฐ€์žฅ ๋‚˜์ค‘์— ๋“ค์–ด์˜จ ๊ฒƒ์ด ๊ฐ€์žฅ ๋จผ์ € ๋‚˜์˜ค๋Š” LIFO์˜ ํŠน์ง•์„ ๊ฐ€์ง€๋Š” ์ž๋ฃŒ๊ตฌ์กฐ ์‚ฝ์ž…(Push) append() ์‹œ๊ฐ„๋ณต์žก๋„: O(1) ์‚ญ์ œ(Pop) removeLast() ๋˜๋Š” popLast() removeLast(): ๋ฐฐ์—ด์ด ๋น„์–ด์žˆ์„ ๋•Œ ์—๋Ÿฌ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ด popLast(): ๋ฐฐ์—ด์ด ๋น„์–ด์žˆ์„ ๋•Œ nil์„ ๋ฐ˜ํ™˜์‹œํ‚ด ์‹œ๊ฐ„๋ณต์žก๋„: O(1) ์Šคํƒ์˜ ๋งˆ์ง€๋ง‰ ์š”์†Œ ์กฐํšŒ(Top) last() ์‹œ๊ฐ„๋ณต์žก๋„: O(1) ๊ตฌํ˜„ import Foundation struct Stack { var elements: [T] = [] var count : Int { return elements.count } var isEmpty : Bool { return elements.isEmpty } mutating func pop..
kiuun
'๐Ÿ–ฅ๏ธ CS/์ž๋ฃŒ๊ตฌ์กฐ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๊ธ€ ๋ชฉ๋ก