์ž๋ฃŒ๊ตฌ์กฐ: Hash

ํ•ด์‹œ์— ๋Œ€ํ•œ ๊ฐœ๋…๋ณด๋‹ค๋Š” C๋กœ ํ•ด์‹œ๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ , data type์— ์ž์œ ๋กญ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌํ˜„์  ์ธก๋ฉด์—์„œ ํ•ด์‹œ๋ฅผ ๋‹ค๋ฃจ๊ณ ์ž ํ•œ๋‹ค. key-value pair๋ฅผ ๊ตฌ์กฐ์ฒด์—์„œ ๋ณ„๋„๋กœ ๋ช…์‹œํ•˜์ง€ ์•Š๊ณ , entry์— ๋‹ค๋ฅธ ๊ตฌ์กฐ์ฒด๋ฅผ ํฌ์ธํŒ…ํ•จ์œผ๋กœ์จ ๋” ๋งŽ์€ ์ž๋ฃŒ๋ฅผ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋„๋ก ๊ตฌํ˜„ํ•˜์˜€๋‹ค. Hash? ํ•ด์‹œ๋Š” ์œ„์˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด, key ๊ฐ’์„ ์ƒ์„ฑํ•˜๋Š” `ํ•ด์‹œ ํ•จ์ˆ˜(hash function)`๋ฅผ ํ†ตํ•ด ๋ฐฐ์—ด์— ์–ด๋–ค ๊ฐ’์ด ์žˆ๋Š”์ง€ ์ฆ‰๊ฐ์ ์„ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค. ํŠธ๋ฆฌ์˜ ๊ฒฝ์šฐ ํ•œ์ชฝ์œผ๋กœ ํƒ์ƒ‰์„ ํ•˜์—ฌ ๋ฒ”์œ„๋ฅผ ์ขํ˜€๊ฐ€๋ฉด์„œ ํƒ์ƒ‰์„ ํ•œ๋‹ค. ํ•˜์ง€๋งŒ ํ•ด์‹œ์˜ ๊ฒฝ์šฐ ํ•ด์‹œ ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด, ์ฐพ๊ณ ์ž ํ•˜๋Š” ๊ฐ’์˜ key๋ฅผ ์ฆ‰๊ฐ์ ์œผ๋กœ ์•Œ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ํƒ์ƒ‰์— ๋งค์šฐ ํšจ์œจ์ ์ธ ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค. ํ•˜์ง€๋งŒ ํ•ด์‹œ์—์„œ๋„ ๋ฌธ์ œ์ ์€ ์žˆ๋‹ค. `์ถฉ๋Œ(Collision)`์ด ๋ฐœ..

์•Œ๊ณ ๋ฆฌ์ฆ˜: ์ •๋ ฌ

์ •๋ ฌ ๋ฐฉ์‹ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ์ •๋ ฌ ๋ฐฉ์‹์€ ํฌ๊ฒŒ 2๊ฐ€์ง€๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ๋กœ 2์ค‘ ๋ฐ˜๋ณต๋ฌธ์„ ์‚ฌ์šฉํ•˜๋Š” Bubble, Select, Insert ์ •๋ ฌ์ด๋‹ค. ๋‘ ๋ฒˆ์งธ๋Š” ๋ถ„ํ• -์ •๋ณต ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋Š” ๋ณ‘ํ•ฉ, ํ€ต ์ •๋ ฌ์ด๋‹ค. 2์ค‘ ๋ฐ˜๋ณต๋ฌธ์„ ์‚ฌ์šฉํ•˜๋Š” ์ •๋ ฌ ๋ฐฉ์‹ ํ•ด๋‹น ๋ฐฉ์‹์€ ์ตœ์•…์˜ ๊ฒฝ์šฐ ์‹œ๊ฐ„๋ณต์žก๋„๋Š” O(N^2)์ด ๋œ๋‹ค. ์ด์™€ ๊ฐ™์€ ์ด์œ ๋Š” 2๊ฐœ์˜ ๋ฐ˜๋ณต๋ฌธ์„ ํ†ตํ•ด ๊ฐ’์„ ๋น„๊ตํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. Bubble Sort ์„œ๋กœ ์ธ์ ‘ํ•œ ๋‘ ์›์†Œ๋ฅผ ๊ฒ€์‚ฌํ•˜์—ฌ ์ •๋ ฌํ•˜๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•œ๋‹ค. swap์ด ๋” ์ด์ƒ ๋ฐœ์ƒํ•˜์ง€ ์•Š์œผ๋ฉด, ์ค‘๋‹จํ•˜์—ฌ ๋ถˆํ•„์š”ํ•œ ๋ฐ˜๋ณต๋ฌธ์„ ์‹คํ–‰ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค. def bubble_sort(nums): for i in range(len(nums)): swap = False for j in range(1, len(nums)): if ..

์•Œ๊ณ ๋ฆฌ์ฆ˜: DFS์™€ BFS

๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰ ๋ฐฉ๋ฒ• ๊ทธ๋ž˜ํ”„๋ฅผ ํƒ์ƒ‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์ค‘ DFS(Depth First Search์™€ BFS(Breadth First Search)๋ฅผ ๊ฐ„๋‹จํ•œ ์˜ˆ์‹œ๋ฅผ ํ†ตํ•ด ์ดํ•ดํ•˜๊ณ ์ž ํ•œ๋‹ค. ๋‘ ๋ฐฉ์‹์€ ๊ฐ๊ฐ Stack๊ณผ Queue๋ฅผ ํ†ตํ•ด ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ทธ๋ž˜ํ”„ ๋ฐฉ๋ฌธ ์—ฌ๋ถ€๋ฅผ ์ฒดํฌํ•˜์—ฌ ์ค‘๋ณต์œผ๋กœ ํƒ์ƒ‰ํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜์—ฌ์•ผ ํ•œ๋‹ค. ๊ทธ๋ž˜ํ”„๋ฅผ ์ฝ”๋“œ๋กœ ๋‚˜ํƒ€๋‚ด๊ธฐ ๊ทธ๋ฆผ 1์˜ ๊ทธ๋ž˜ํ”„์— ๋Œ€ํ•œ ๋…ธ๋“œ ์ •๋ณด๋ฅผ ์ฝ”๋“œ๋กœ ๋‚˜ํƒ€๋‚ด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. graph = { 'A': ['B', 'C'], 'B': ['A', 'D'], 'C': ['A', 'E', 'F'], 'D': ['B', 'G'], 'E': ['C', 'H'], 'F': ['C'], 'G': ['D'], 'H': ['E'], } DFS ๊ทธ๋ฆผ 2๋Š” ๋ฃจํŠธ ๋…ธ๋“œ๋ฅผ ์‹œ์ž‘์œผ๋กœ ๋ชจ๋“  ๊ทธ๋ž˜ํ”„ ๊ฒฝ๋กœ๋ฅผ ํƒ์ƒ‰ํ•˜..

์•Œ๊ณ ๋ฆฌ์ฆ˜: Recursion

Recursion? ์žฌ๊ท€๋Š” ํŠน์ • ํ•จ์ˆ˜ ๋‚ด์—์„œ ํ•จ์ˆ˜ ์ž์‹ ์„ ๋‹ค์‹œ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. ์žฌ๊ท€๋Š” Stack์˜ ํŠน์„ฑ์„ ๊ทธ๋Œ€๋กœ ๋ฐ˜์˜ํ•˜์—ฌ, ๊ฐ€์žฅ ์ตœ๊ทผ์— ํ˜ธ์ถœ๋œ ํ•จ์ˆ˜ ๋ถ€ํ„ฐ ์ฒ˜๋ฆฌ๋˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ง„ํ–‰๋œ๋‹ค. ์žฌ๊ท€๋ฅผ ์ž˜ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋‹ค๋ฉด DFS์™€ ๋ฐฑํŠธ๋ž˜ํ‚น, ํŠธ๋ฆฌ ํƒ์ƒ‰๊ณผ ๊ฐ™์€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐ ํ• ๋•Œ ํšจ์œจ์ ์œผ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. ์ด์ง„ ํŠธ๋ฆฌ ์ˆœํšŒ ๊ทธ๋ฆผ 1๊ณผ ๊ฐ™์€ ์ด์ง„ ํŠธ๋ฆฌ๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ, 3๊ฐ€์ง€ ๋ฐฉ์‹์œผ๋กœ ํŠธ๋ฆฌ๋ฅผ ์ˆœํšŒํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ๋Š” ์ „์œ„ ์ˆœํšŒ๋กœ 1-2-4-5-3-6-7 ์ˆœ์„œ๋กœ ํŠธ๋ฆฌ๋ฅผ ์ˆœํšŒํ•œ๋‹ค. ๋‘ ๋ฒˆ์งธ๋Š” ์ค‘์œ„ ์ˆœํšŒ๋กœ 4-2-5-1-6-3-7 ์ˆœ์„œ๋กœ ํŠธ๋ฆฌ๋ฅผ ์ˆœํšŒ ํ•œ๋‹ค. ๋งˆ์ง€๋ง‰์œผ๋กœ ํ›„์œ„์ˆœํšŒ๋Š” 4-5-2-6-7-3-1๋กœ ์ˆœํšŒํ•œ๋‹ค. ํŠธ๋ฆฌ๋ฅผ ์ˆœํšŒํ•˜๋Š” ๊ฒƒ์€ ์žฌ๊ท€ ํ˜ธ์ถœ์„ ํ†ตํ•ด์„œ ๊ตฌํ˜„ ํ•  ์ˆ˜ ์žˆ๋‹ค. Simple Tree Travel de..

์ž๋ฃŒ๊ตฌ์กฐ: Linked List

Linked List? ๋‹จ์ˆœํ•œ ์„ ํ˜• ๋ฐฐ์—ด(๋ฆฌ์ŠคํŠธ)์„ ์„ ์–ธํ•˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์—ฐ์†์ ์œผ๋กœ ํ• ๋‹นํ•œ๋‹ค. ๋งŒ์•ฝ, ๋ฐฐ์—ด ๋‚ด์˜ ๊ฐ’ ์‚ญ์ œ๊ฐ€ ํ•„์š”ํ•˜๊ฑฐ๋‚˜ ์ถ”๊ฐ€๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๊ฐ’๋“ค์˜ ์ž๋ฆฌ ๊ต์ฒด๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ์ด์™€ ๋‹ฌ๋ฆฌ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋Š” ์—ฐ์†์ ์ธ ๊ณต๊ฐ„์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , ๊ฐ๊ฐ์˜ ๋…ธ๋“œ๋“ค์„ ์—ฐ๊ฒฐํ•œ ๊ตฌ์กฐ๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์ค‘๊ฐ„์˜ ๊ฐ’ ์‚ญ์ œ๊ฐ€ ๋นˆ๋ฒˆํ•˜๊ฒŒ ์ผ์–ด๋‚˜๋Š” ์ž๋ฃŒ๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ์— ๋ณด๋‹ค ํšจ์œจ์ ์ด๋‹ค. Single Linked List class Node: def __init__(self, data): self.data = data self.next = None class SingleLinkedList: def __init__(self, data): self.head = Node(data) def add(self, data): node = self.head w..

์ž๋ฃŒ๊ตฌ์กฐ: Queue

Queue? ๊ฐ€์žฅ ์ฒ˜์Œ์— ์‚ฝ์ž…๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋จผ์ € ๋บ„ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ์‹(First in First Out) ํ˜•์‹์˜ ์ž๋ฃŒ๊ตฌ์กฐ Queue์˜ ์—ฐ์‚ฐ enqueue(data) : data๋ฅผ Queue์˜ ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰์— ์ถ”๊ฐ€ํ•œ๋‹ค. dequeue() : Queue์˜ ๊ฐ€์žฅ ์ตœ๊ทผ์— ์ถ”๊ฐ€๋œ data๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ๋ฐ˜ํ™˜ํ•œ๋‹ค. peek() : pop()๊ณผ ๋‹ฌ๋ฆฌ ๊ฐ€์žฅ ์ตœ๊ทผ์— ์ถ”๊ฐ€๋œ data๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , ์ œ๊ฑฐํ•˜์ง„ ์•Š๋Š”๋‹ค. is_empty() : pop()์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ถ”๊ฐ€๋œ data๊ฐ€ ์กด์žฌํ•˜์—ฌ์•ผ ํ•˜๋Š”๋ฐ ์ด๋ฅผ ํŒ๋ณ„ํ•˜๊ธฐ ์œ„ํ•จ์ด๋‹ค. Queue๋ฅผ ํ™œ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์„ ์ž…์„ ์ถœ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ํ”„๋กœ์„ธ์Šค ๊ด€๋ฆฌ, ์šฐ์„ ์ˆœ์œ„ ๋Œ€๊ธฐ์—ด, ํ”„๋ฆฐํ„ฐ ์ถœ๋ ฅ ์ฒ˜๋ฆฌ ๋“ฑ BFS ๊ตฌํ˜„ Queue์˜ ์„ ์ž…์„ ์ถœ ๋ฐฉ์‹์„ ํ†ตํ•ด BFS๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. DFS์˜ ๊ฒฝ์šฐ Stack์„ ์‚ฌ์šฉ..

์ž๋ฃŒ๊ตฌ์กฐ: Stack

Stack? ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰์— ์‚ฝ์ž…๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋จผ์ € ๋บ„ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ์‹(Last in First Out) ํ˜•์‹์˜ ์ž๋ฃŒ๊ตฌ์กฐ Stack์˜ ์—ฐ์‚ฐ push(data) : data๋ฅผ stack์˜ ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰์— ์ถ”๊ฐ€ํ•œ๋‹ค. pop() : stack์˜ ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰์— ์ถ”๊ฐ€๋œ data๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ๋ฐ˜ํ™˜ํ•œ๋‹ค. peek() : pop()๊ณผ ๋‹ฌ๋ฆฌ ๊ฐ€์žฅ ์ตœ๊ทผ์— ๋งˆ์ง€๋ง‰์˜ data๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , ์ œ๊ฑฐํ•˜์ง„ ์•Š๋Š”๋‹ค. is_empty() : pop()์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ถ”๊ฐ€๋œ data๊ฐ€ ์กด์žฌํ•˜์—ฌ์•ผ ํ•˜๋Š”๋ฐ ์ด๋ฅผ ํŒ๋ณ„ํ•˜๊ธฐ ์œ„ํ•จ์ด๋‹ค. Stack์„ ํ™œ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์žฌ๊ท€ ํ˜ธ์ถœ ์žฌ๊ท€์ ์œผ๋กœ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒฝ์šฐ, ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰์— ํ˜ธ์ถœ๋œ ํ•จ์ˆ˜ ๋ถ€ํ„ฐ ์ฐจ๋ก€๋กœ ์‹คํ–‰๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์žฌ๊ท€ ํ˜ธ์ถœ์˜ ๊ฒฝ์šฐ Stack์„ ํ†ตํ•ด ์ด๋ฅผ ๊ฐ€๋Šฅํ•˜๋„๋ก ํ•œ๋‹ค. ์ˆ˜์‹์˜ ๊ด„ํ˜ธ ๊ฒ€์‚ฌ (..

๊ธ€ ๋ณด๊ด€ํ•จ
์ตœ๊ทผ์— ์˜ฌ๋ผ์˜จ ๊ธ€
์ตœ๊ทผ์— ๋‹ฌ๋ฆฐ ๋Œ“๊ธ€