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

[Data Structure] ํŠธ๋ฆฌ (Tree)

ํŠธ๋ฆฌ (Tree) ๊ตฌ์กฐ Node์™€ Branch๋ฅผ ์ด์šฉํ•ด์„œ, ์‚ฌ์ดํด์„ ์ด๋ฃจ์ง€ ์•Š๋„๋ก ๊ตฌ์„ฑํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ์ด์ง„ ํŠธ๋ฆฌ(Binary Tree) ํ˜•ํƒœ์˜ ๊ตฌ์กฐ, ํƒ์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ตฌํ˜„์— ๋งŽ์ด ์‚ฌ์šฉ ํŠธ๋ฆฌ ๊ด€๋ จ ์šฉ์–ด Node : ํŠธ๋ฆฌ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ธฐ๋ณธ ์š”์†Œ(๋ฐ์ดํ„ฐ์™€ ๋‹ค๋ฅธ ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ์— ๋Œ€ํ•œ Branch ์ •๋ณด ํฌํ•จ) Root Node : ํŠธ๋ฆฌ ๋งจ ์œ„์— ์žˆ๋Š” ๋…ธ๋“œ Level : ์ตœ์ƒ์œ„ ๋…ธ๋“œ๋ฅผ Level 0 ์œผ๋กœ ํ–ˆ์„ ๋•Œ, ํ•˜์œ„ Branch๋กœ ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ์˜ ๊นŠ์ด Parent Node : ์–ด๋–ค ๋…ธ๋“œ์˜ ๋‹ค์Œ ๋ ˆ๋ฒจ์— ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ Child Node : ์–ด๋–ค ๋…ธ๋“œ์˜ ์ƒ์œ„ ๋ ˆ๋ฒจ์— ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ Leaf Node(Terminal Node) : Child Node๊ฐ€ ํ•˜๋‚˜๋„ ์—†๋Š” ๋…ธ๋“œ Sibling (Brother Node) : ๋™์ผ..

[Data Structure] hash() ํ•ด์‹œ ํ•จ์ˆ˜

SHA(Secure Hash Algorithm) - ์•ˆ์ „ํ•œ ํ•ด์‹œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ - ์–ด๋–ค ๋ฐ์ดํ„ฐ๋„ ์œ ์ผํ•œ ๊ณ ์ •๋œ ํฌ๊ธฐ์˜ ๊ณ ์ •๊ฐ’์„ ๋ฆฌํ„ด SHA-1 import hashlib data = 'test'.encode() hash_object = hashlib.sha1() hash_object.update(data) hex_dig = hash_object.hexdigest() print(hex_dig) #a94a8fe5ccb19ba61c4c0873d391e987982fbbd3 SHA-256 import hashlib data = 'test'.encode() hash_object = hashlib.sha256() hash_object.update(data) hex_dig = hash_object.hexdigest() pr..

[Data Structure] ์ถฉ๋Œ(Collision) ํ•ด๊ฒฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜ : ํ•ด์‹œ ํ•จ์ˆ˜

# ํ•ด์‹œ ํ…Œ์ด๋ธ”์˜ ๊ฐ€์žฅ ํฐ ๋ฌธ์ œ๋Š” ์ถฉ๋Œ(Collision) => Hash Collision 01. Chaining ๊ธฐ๋ฒ• ๊ฐœ๋ฐฉ ํ•ด์‹ฑ(Open Hashing) ๊ธฐ๋ฒ• ์ค‘ ํ•˜๋‚˜ -> ํ•ด์‹œ ํ…Œ์ด๋ธ”์˜ ์ €์žฅ๊ณต๊ฐ„ ์™ธ์˜ ๊ณต๊ฐ„์„ ํ™œ์šฉํ•˜๋Š” ๊ธฐ๋ฒ• ์ถฉ๋Œ ์‹œ, ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€๋กœ ๋’ค์— ์—ฐ๊ฒฐ์‹œ์ผœ ์ €์žฅํ•˜๋Š” ๊ธฐ๋ฒ• hash_table = list([0 for i in range(8)]) def get_key(data): return hash(data) def hash_function(key): return key % 8 def save_data(data, value): index_key = get_key(data) hash_address = hash_function(index_key) if hash_tab..

[Data Structure] ํ•ด์‹œ ํ…Œ์ด๋ธ” (Hash Table)

ํ•ด์‹œ ํ…Œ์ด๋ธ” (Hash Table) ? ํ‚ค(Key)์— ๋ฐ์ดํ„ฐ(Value)๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ Key๋ฅผ ํ†ตํ•ด ๋ฐ”๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์˜ฌ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ๋น ๋ฅธ ์†๋„ ํŒŒ์ด์ฌ์—์„œ๋Š” ๋”•์…”๋„ˆ๋ฆฌ(Dictionary) ํƒ€์ž…์œผ๋กœ ๊ตฌํ˜„ ๊ฐ€๋Šฅ ๋ณดํ†ต ๋ฐฐ์—ด๋กœ ๋ฏธ๋ฆฌ Hash Table ์‚ฌ์ด์ฆˆ๋งŒํผ ์ƒ์„ฑ ํ›„ ์‚ฌ์šฉ (๊ณต๊ฐ„๊ณผ ํƒ์ƒ‰ ์‹œ๊ฐ„ ๋งž๋ฐ”๊พธ๋Š” ๊ธฐ๋ฒ•) ๊ด€๋ จ ์šฉ์–ด ํ•ด์‹œ(Hash) : ์ž„์˜ ๊ฐ’์„ ๊ณ ์ • ๊ธธ์ด๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ ํ•ด์‹œ ํ…Œ์ด๋ธ”(Hash Table) : ํ‚ค ๊ฐ’์˜ ์—ฐ์‚ฐ์— ์˜ํ•ด ์ง์ ‘ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ํ•ด์‹ฑ ํ•จ์ˆ˜(Hashing Function) : Key์— ๋Œ€ํ•ด ์‚ฐ์ˆ  ์—ฐ์‚ฐ์„ ์ด์šฉํ•ด, ๋ฐ์ดํ„ฐ ์œ„์น˜๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜ ํ•ด์‹œ ๊ฐ’(Hash Value), ํ•ด์‹œ ์ฃผ์†Œ(Hash Address) : Key๋ฅผ ํ•ด์‹ฑ ํ•จ์ˆ˜๋กœ ์—ฐ์‚ฐํ•ด์„œ, ํ•ด์‹œ ๊ฐ’์„ ์•Œ์•„๋‚ด..

[Algorithm] ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ณต์žก๋„ : ์‹œ๊ฐ„ ๋ณต์žก๋„ / Big-O (๋น… ์˜ค) ํ‘œ๊ธฐ๋ฒ•

์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ณต์žก๋„ ? ํ•˜๋‚˜์˜ ๋ฌธ์ œ๋ฅผ ํ‘ธ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋‹ค์–‘ํ•  ์ˆ˜ ์žˆ์Œ => ์–ด๋Š ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๋” ์ข‹์€์ง€๋ฅผ ๋ถ„์„ํ•˜๊ธฐ ์œ„ํ•ด, ๋ณต์žก๋„ ๊ณ„์‚ฐ ํ•„์š” ์‹œ๊ฐ„ ๋ณต์žก๋„ : ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์‹คํ–‰ ์†๋„ (๋ฐ˜๋ณต๋ฌธ์ด ์ˆ˜ํ–‰์‹œ๊ฐ„ ์ง€๋ฐฐ) ๊ณต๊ฐ„ ๋ณต์žก๋„ : ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์ด์ฆˆ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์„ฑ๋Šฅ ํ‘œ๊ธฐ๋ฒ• Big O (๋น…-์˜ค) ํ‘œ๊ธฐ๋ฒ• : O(N) ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ตœ์•…์˜ ์‹คํ–‰ ์‹œ๊ฐ„์„ ํ‘œ๊ธฐ ๊ฐ€์žฅ ๋งŽ์ด/์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉํ•จ ์•„๋ฌด๋ฆฌ ์ตœ์•…์˜ ์ƒํ™ฉ์ด๋ผ๋„, ์ด์ •๋„์˜ ์„ฑ๋Šฅ์€ ๋ณด์žฅํ•œ๋‹ค๋Š” ์˜๋ฏธ O(์ž…๋ ฅ) : ์ž…๋ ฅn์— ๋”ฐ๋ผ ๊ฒฐ์ •๋˜๋Š” ์‹œ๊ฐ„ ๋ณต์žก๋„ ํ•จ์ˆ˜ -> n์˜ ํฌ๊ธฐ์— ๋”ฐ๋ผ ๊ธฐํ•˜๊ธ‰์ˆ˜์ ์œผ๋กœ ์‹œ๊ฐ„ ๋ณต์žก๋„ ๋Š˜์–ด๋‚  ์ˆ˜ ์žˆ์Œ โ„ฆ (์˜ค๋ฉ”๊ฐ€) ํ‘œ๊ธฐ๋ฒ• : โ„ฆ(N) ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ตœ์ƒ์˜ ์‹คํ–‰ ์‹œ๊ฐ„์„ ํ‘œ๊ธฐ Θ (์„ธํƒ€) ํ‘œ๊ธฐ๋ฒ• : Θ(N) ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ‰๊ท  ์‹คํ–‰ ์‹œ๊ฐ„์„ ํ‘œ๊ธฐ

[Data Structure] ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ (Linked List)

๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ (Linked List) ? ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ ๋ฐฐ์—ด์€ ์ˆœ์ฐจ์ ์œผ๋กœ ์—ฐ๊ฒฐ๋œ ๊ณต๊ฐ„์— ๋ฐ์ดํ„ฐ๋ฅผ ๋‚˜์—ดํ•˜๋Š” ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ๋–จ์–ด์ง„ ๊ณณ์— ์กด์žฌํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ํ™”์‚ดํ‘œ๋กœ ์—ฐ๊ฒฐํ•ด์„œ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ C์—์„œ๋Š” ์ฃผ์š”ํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์ง€๋งŒ, Python์€ ๋ฆฌ์ŠคํŠธ ํƒ€์ž…์ด ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ์˜ ๊ธฐ๋Šฅ์„ ๋ชจ๋‘ ์ง€์› ๊ธฐ๋ณธ ๊ตฌ์กฐ ๋…ธ๋“œ(Node) : ๋ฐ์ดํ„ฐ ์ €์žฅ ๋‹จ์œ„(๋ฐ์ดํ„ฐ๊ฐ’, ํฌ์ธํ„ฐ)๋กœ ๊ตฌ์„ฑ ํฌ์ธํ„ฐ(Pointer) : ๊ฐ ๋…ธ๋“œ ์•ˆ์—์„œ, ๋‹ค์Œ์ด๋‚˜ ์ด์ „์˜ ์—ฐ๊ฒฐ ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ณต๊ฐ„ ์žฅ์  (C์–ธ์–ด ์ž…์žฅ์—์„œ) ๋ฏธ๋ฆฌ ๋ฐ์ดํ„ฐ ๊ณต๊ฐ„์„ ๋ฏธ๋ฆฌ ํ• ๋‹นํ•˜์ง€ ์•Š์•„๋„ ๋จ (๋ฐฐ์—ด์€ ํ• ๋‹น ํ•„์š”) ๋‹จ์  (C์–ธ์–ด ์ž…์žฅ์—์„œ) ์—ฐ๊ฒฐ์„ ์œ„ํ•œ ๋ณ„๋„ ๋ฐ์ดํ„ฐ ๊ณต๊ฐ„์ด ํ•„์š”ํ•˜๋ฏ€๋กœ, ์ €์žฅ๊ณต๊ฐ„ ํšจ์œจ์ด ๋†’์ง€ ์•Š์Œ ์—ฐ๊ฒฐ ์ •๋ณด๋ฅผ ์ฐพ๋Š” ์‹œ๊ฐ„์ด ํ•„์š”ํ•˜๋ฏ€๋กœ ์ ‘๊ทผ ์†๋„๊ฐ€ ๋Š๋ฆผ ์ค‘๊ฐ„ ๋ฐ์ดํ„ฐ ์‚ญ์ œ ์‹œ..

[Data Structure] ๋ฐฐ์—ด(array) / ํ(queue) / ์Šคํƒ(stack)

1. ๋ฐฐ์—ด (Array) ๊ฐ™์€ ์ข…๋ฅ˜์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ ๊ฐ™์€ ์ข…๋ฅ˜์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆœ์ฐจ์ ์œผ๋กœ ์ €์žฅ ์žฅ์  : ๋น ๋ฅธ ์ ‘๊ทผ ๊ฐ€๋Šฅ ๋‹จ์  : ๋ฐ์ดํ„ฐ์˜ ์ถ”๊ฐ€/ ์‚ญ์ œ์˜ ์–ด๋ ค์›€ FIFO(First-In, First-Out) ํ™œ์šฉ : ๋ฉ€ํ‹ฐ ํƒœ์Šคํ‚น์„ ์œ„ํ•œ ํ”„๋กœ์„ธ์Šค ์Šค์ผ€์ฅด๋ง ๋ฐฉ์‹ ๊ตฌํ˜„์— ์‚ฌ์šฉ Enqueue : ํ์— ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ๋Š” ๊ธฐ๋Šฅ / Dequeue : ํ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊บผ๋‚ด๋Š” ๊ธฐ๋Šฅ Queue() : ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ํ / FIFO import queue data = queue.Queue() data = put("apple") data = put(3) data.qsize() #2 data.get() #์ธ๋ฑ์Šค๋ฅผ ์ž…๋ ฅํ•˜์ง€ ์•Š์Œ(FIFO) => 'apple' data.qsize() #3 data.get() #1 L..

[Algorithm] ์ž๋ฃŒ๊ตฌ์กฐ์™€ ์•Œ๊ณ ๋ฆฌ์ฆ˜

์ž๋ฃŒ๊ตฌ์กฐ ? ์ž๋ฃŒ๊ตฌ์กฐ , ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ, data structure ๋Œ€๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ์˜ ๊ตฌ์กฐ๋ฅผ ์˜๋ฏธ ์ฝ”๋“œ ์ƒ์—์„œ ํšจ์œจ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด, ๋ฐ์ดํ„ฐ ํŠน์„ฑ์— ๋”ฐ๋ผ, ์ฒด๊ณ„์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ตฌ์กฐํ™” => ์–ด๋–ค ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š๋ƒ์— ๋”ฐ๋ผ, ์ฝ”๋“œ ํšจ์œจ์ด ๋‹ฌ๋ผ์ง ์•Œ๊ณ ๋ฆฌ์ฆ˜ ? ์•Œ๊ณ ๋ฆฌ์ฆ˜, algorithm ์–ด๋–ค ๋ฌธ์ œ๋ฅผ ํ’€๊ธฐ ์œ„ํ•œ ์ ˆ์ฐจ/๋ฐฉ๋ฒ• ์–ด๋–ค ๋ฌธ์ œ์— ๋Œ€ํ•ด ํŠน์ •ํ•œ '์ž…๋ ฅ'์„ ๋„ฃ์œผ๋ฉด, ์›ํ•˜๋Š” '์ถœ๋ ฅ'์„ ์–ป์„ ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“œ๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ