๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Programming/์ทจ์—…์ค€๋น„&CS Study

[CS์Šคํ„ฐ๋”” #01] ์ž๋ฃŒ๊ตฌ์กฐ(Array, LinkedList, Tree, Hash)

 

๐Ÿ’ป ์ž๋ฃŒ๊ตฌ์กฐ: Data Structure

 

 

 

โ—ป๏ธ Array

   ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ์ž๋ฃŒ๊ตฌ์กฐ๋กœ, ๋…ผ๋ฆฌ์  ์ €์žฅ ์ˆœ์„œ์™€ ๋ฌผ๋ฆฌ์  ์ €์žฅ ์ˆœ์„œ๊ฐ€ ์ผ์น˜ํ•œ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์ธ๋ฑ์Šค(index)๋กœ ๋น ๋ฅด๊ฒŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์–ด search์˜ ๊ฒฝ์šฐ O(1)์˜ ๋น ๋ฅธ ์†๋„๋ฅผ ๋ณด์—ฌ์ค€๋‹ค. 

   ๋‹ค๋งŒ ์‚ฝ์ž…/์‚ญ์ œ์˜ ๊ฒฝ์šฐ ๋ฐฐ์—ด์˜ ์—ฐ์†์ ์ธ ํŠน์ง•์ด ๊นจ์ง€๊ธฐ ๋•Œ๋ฌธ์— ๋‚˜๋จธ์ง€ ์›์†Œ๋“ค์„ shift ํ•ด์ฃผ๋Š” O(n)์˜ ๋น„์šฉ์ด ๋ฐœ์ƒํ•˜๊ฒŒ ๋œ๋‹ค. 

 

 

โ—ป๏ธ Linked List

   ๋…ผ๋ฆฌ์  ์ €์žฅ ์ˆœ์„œ์™€ ๋ฌผ๋ฆฌ์  ์ €์žฅ ์ˆœ์„œ๊ฐ€ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค. ๊ฐ๊ฐ์˜ ์›์†Œ๋Š” ๋‹ค์Œ ์›์†Œ๊ฐ€ ๋ฌด์—‡์ธ์ง€๋งŒ์„ ์•Œ๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์‚ฝ์ž…/์‚ญ์ œ์˜ ๋น„์šฉ์€ O(1)๋กœ ๋งค์šฐ ๊ฐ„๋‹จํ•˜๋‹ค.

   ๋‹ค๋งŒ, ์—ฐ์†์ ์ด์ง€ ์•Š์€ ํŠน์„ฑ ๋•Œ๋ฌธ์— ํŠน์ • ์›์†Œ์— ์ ‘๊ทผํ•  ๊ฒฝ์šฐ ํ•ด๋‹น ์›์†Œ๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด ๋ชจ๋“  ์›์†Œ๋ฅผ ๋“ค์—ฌ๋‹ค ๋ด์•ผํ•˜๋Š” ๋น„์šฉ์ด O(n)์œผ๋กœ ๋ฐœ์ƒํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์‚ฝ์ž…/์‚ญ์ œ์˜ ๊ฒฝ์šฐ์—๋„ ์ž‘์—…ํ•  ์›์†Œ๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด ๋น„์šฉ์ด ๋ฐœ์ƒํ•˜๋ฏ€๋กœ ์„œ์น˜/์‚ฝ์ž…/์‚ญ์ œ ๋ชจ๋‘ worst case๋กœ O(n)์˜ ์‹œ๊ฐ„์ด ์†Œ์š”๋œ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

   Linked List๋Š” Tree์˜ ๊ทผ๊ฐ„์ด ๋˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ๋กœ ์œ ์šฉํ•˜๊ฒŒ ์“ฐ์ธ๋‹ค.

 

 

 

 

 

๐Ÿ’™ ๐Ÿ’™ ๐Ÿ’™

 

 

โ—ป๏ธ Stack

 ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ์ž๋ฃŒ๊ตฌ์กฐ ์ค‘ ํ•˜๋‚˜๋กœ, ํ›„์ž…์„ ์ถœ(LIFO) ๊ตฌ์กฐ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•œ๋‹ค. ๋ณดํ†ต Array๋กœ ๊ตฌํ˜„ํ•˜๋Š”๋ฐ, ์ด๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ฑฐํ•  ํ•„์š”์—†์ด ๋ง๋‹จ index๋งŒ ์ค„์—ฌ๊ฐ€๋ฉฐ ์ดˆ๊ธฐํ™”๊ฐ€ ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

 

โ—ป๏ธ Queue

 ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ์ž๋ฃŒ๊ตฌ์กฐ ์ค‘ ํ•˜๋‚˜๋กœ, ์„ ์ž…์„ ์ถœ(FIFO)๊ตฌ์กฐ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•œ๋‹ค. ๋ณดํ†ต ์•ž๋‹จ์˜ ์‚ฝ์ž…/์‚ญ์ œ๊ฐ€ ์šฉ์ดํ•˜๋„๋ก ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋กœ ๊ตฌํ˜„๋œ๋‹ค.

 * Priority Queue (์šฐ์„ ์ˆœ์œ„ ํ): ๊ฐ€์žฅ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋จผ์ € ๊บผ๋‚ด๊ธฐ ์œ„ํ•ด ๊ณ ์•ˆ๋œ ์ž๋ฃŒ๊ตฌ์กฐ๋กœ, ์ผ๋ฐ˜์ ์œผ๋กœ ํž™์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„๋œ๋‹ค.

 

 

โ—ป๏ธ Heap

 ์™„์ „ ์ด์ง„ํŠธ๋ฆฌ์˜ ์ผ์ข…์œผ๋กœ, ์šฐ์„ ์ˆœ์œ„ ํ๋ฅผ ์œ„ํ•˜์—ฌ ๋งŒ๋“ค์–ด์ง„ ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค.

 ์ตœ๋Œ€ํž™, ์ตœ์†Œํž™์ด ์žˆ์–ด ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๊ฐ’๋“ค ์ค‘์—์„œ ์ตœ๋Œ€๊ฐ’์ด๋‚˜ ์ตœ์†Œ๊ฐ’์„ ๋น ๋ฅด๊ฒŒ ์ฐพ์•„๋‚ด๋„๋ก ๋งŒ๋“ค์–ด์กŒ๋‹ค.

 ํž™์„ ์ €์žฅํ•˜๋Š” ํ‘œ์ค€์ ์ธ ์ž๋ฃŒ๊ตฌ์กฐ๋Š” ๋ฐฐ์—ด์ด๋‹ค. ์‚ฝ์ž…์˜ ๊ฒฝ์šฐ ๊ฐ€์žฅ ๋ง๋‹จ์— ๋„ฃ์–ด์„œ ๋ฐ”๋กœ ์œ„ ๋ถ€๋ชจ๋…ธ๋“œ๋ž‘ ๋น„๊ตํ•ด๊ฐ€๋ฉฐ ํž™์„ ์ •๋ ฌํ•˜๊ณ , ์‚ญ์ œ์˜ ๊ฒฝ์šฐ ๋ฃจํŠธ๋…ธ๋“œ๋ฅผ ์ œ๊ฑฐํ•œ ์ž๋ฆฌ์— ๋ง๋‹จ ๋…ธ๋“œ๋ฅผ ๊ฐ€์ ธ์˜จ ๋‹ค์Œ ์ž์‹๋…ธ๋“œ์™€ ๋น„๊ตํ•ด๊ฐ€๋ฉฐ ํž™์„ ์ •๋ ฌํ•œ๋‹ค.

 

 

 

 

 

๐Ÿ’™ ๐Ÿ’™ ๐Ÿ’™

 

 

โ—ป๏ธ Tree

 ํŠธ๋ฆฌ๋Š” ๋ฐฐ์—ด, ์Šคํƒ, ํ์™€ ๊ฐ™์€ ์„ ํ˜•๊ตฌ์กฐ๊ฐ€ ์•„๋‹Œ ๋น„์„ ํ˜• ๊ตฌ์กฐ์ด๋‹ค. ์ž๋ฃŒ์˜ ๊ณ„์ธต์  ๊ด€๊ณ„๋ฅผ ํ‘œํ˜„ํ•œ๋‹ค.

  • Node(๋…ธ๋“œ): ํŠธ๋ฆฌ๋ฅผ ๊ตฌ์„ฑํ•˜๊ณ  ์žˆ๋Š” ๊ฐ๊ฐ์˜ ์š”์†Œ๋“ค์„ ์˜๋ฏธํ•œ๋‹ค.
  • Edge(๊ฐ„์„ ): ํŠธ๋ฆฌ๋ฅผ ๊ตฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ๋…ธ๋“œ์™€ ๋…ธ๋“œ๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ์„ ์„ ์˜๋ฏธํ•œ๋‹ค.
  • Root Node(๋ฃจํŠธ ๋…ธ๋“œ): ํŠธ๋ฆฌ์—์„œ ์ตœ์ƒ์œ„์— ์žˆ๋Š” ๋…ธ๋“œ๋ฅผ ์˜๋ฏธํ•œ๋‹ค.
  • Terminal Node(=Leaf Node, ๋‹จ๋ง ๋…ธ๋“œ): ํ•˜์œ„์— ๋‹ค๋ฅธ ๋…ธ๋“œ๊ฐ€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์ง€ ์•Š์€ ๋…ธ๋“œ๋ฅผ ์˜๋ฏธํ•œ๋‹ค.
  • Internal Node(๋‚ด๋ถ€ ๋…ธ๋“œ, ๋น„๋‹จ๋ง ๋…ธ๋“œ): ๋‹จ๋ง ๋…ธ๋“œ๋ฅผ ์ œ์™ธํ•œ ๋ชจ๋“  ๋…ธ๋“œ๋กœ ๋ฃจํŠธ ๋…ธ๋“œ๋ฅผ ํฌํ•จํ•œ๋‹ค.

 

โ—ป๏ธ Binary Tree ์ด์ง„ํŠธ๋ฆฌ

   ํ•œ ๋…ธ๋“œ์˜ ์ฐจ์ˆ˜๊ฐ€ 2๋ฅผ ๋„˜์ง€์•Š๋Š” ํŠธ๋ฆฌ๋ฅผ ์˜๋ฏธํ•œ๋‹ค. 

   ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜๊ฐ€ n๊ฐœ์ด๊ณ  root๊ฐ€ 0์ด ์•„๋‹Œ 1์—์„œ ์‹œ์ž‘ํ•  ๋•Œ, i๋ฒˆ์งธ ๋…ธ๋“œ์— ๋Œ€ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์‹์ด ๋งŒ์กฑ๋œ๋‹ค.

   -parent(i) = i/2

   -left_child(i) = i*2

   -right_child(i) = i*2+1

  • Perfect Binary Tree(ํฌํ™” ์ด์ง„ ํŠธ๋ฆฌ): ๋ชจ๋“  ๋ ˆ๋ฒจ์ด ๊ฝ‰ ์ฐฌ ์ด์ง„ํŠธ๋ฆฌ๋ฅผ ์˜๋ฏธํ•œ๋‹ค. 
  • Complete Binary Tree(์™„์ „ ์ด์ง„ ํŠธ๋ฆฌ): ์œ„์—์„œ ์•„๋ž˜๋กœ, ์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ˆœ์„œ๋Œ€๋กœ ์ฐจ๊ณก์ฐจ๊ณก ์ฑ„์›Œ์ง„ ์ด์ง„ํŠธ๋ฆฌ๋ฅผ ๊ฐ€๋ฅดํ‚จ๋‹ค.
  • Full Binary Tree(์ • ์ด์ง„ ํŠธ๋ฆฌ): ๋ชจ๋“  ๋…ธ๋“œ๊ฐ€ 0๊ฐœ ํ˜น์€ 2๊ฐœ์˜ ์ž์‹ ๋…ธ๋“œ๋งŒ์„ ๊ฐ–๋Š” ์ด์ง„ํŠธ๋ฆฌ๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

 

โ—ป๏ธ BST (Binary Search Tree, ์ด์ง„ํƒ์ƒ‰ํŠธ๋ฆฌ)

  ์ด์ง„ํŠธ๋ฆฌ์—์„œ ๋” ํšจ์œจ์ ์ธ ํƒ์ƒ‰์„ ์œ„ํ•ด ์ƒ๊ธด ๊ตฌ์กฐ์ด๋‹ค. ๋ฐ์ดํ„ฐ ์ €์žฅ์— ๊ทœ์น™์ด ๋”ฐ๋ฅธ๋‹ค.

  • ์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ์˜ ๋…ธ๋“œ์— ์ €์žฅ๋œ ํ‚ค๋Š” ์œ ์ผํ•˜๋‹ค.
  • ๋ถ€๋ชจ์˜ ํ‚ค๊ฐ€ ์™ผ์ชฝ ์ž์‹ ๋…ธ๋“œ์˜ ํ‚ค๋ณด๋‹ค ํฌ๋‹ค.
  • ๋ถ€๋ชจ์˜ ํ‚ค๊ฐ€ ์˜ค๋ฅธ์ชฝ ์ž์‹ ๋…ธ๋“œ์˜ ํ‚ค๋ณด๋‹ค ์ž‘๋‹ค.
  • ์™ผ์ชฝ๊ณผ ์˜ค๋ฅธ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ๋„ ์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ์ด๋‹ค.

   ์ด์ง„ํƒ์ƒ‰ํŠธ๋ฆฌ๋Š” ํƒ์ƒ‰์— ์žˆ์–ด O(logN) ์ •ํ™•ํžˆ ๋งํ•˜์ž๋ฉด O(h)๋ผ๊ณ  ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. 

   ์ฃผ์˜ํ•  ์ ์€ Skewed Tree(ํŽธํ–ฅ ํŠธ๋ฆฌ)๊ฐ€ ๋งŒ๋“ค์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ด๋‹ค. ์ €์žฅ ์ˆœ์„œ์— ๋”ฐ๋ผ ํ•œ ์ชฝ์œผ๋กœ๋งŒ ๊ณ„์†ํ•ด์„œ ์ €์žฅ๋œ๋‹ค๋ฉด ํƒ์ƒ‰์˜ Worst Case๋Š” O(n)์ด ๋˜์–ด ์ด์ง„ํƒ์ƒ‰ํŠธ๋ฆฌ์˜ ์žฅ์ ์„ ์‚ด๋ฆฌ์ง€ ๋ชปํ•˜๊ฒŒ ๋œ๋‹ค.

   ์ด๋Ÿฌํ•œ ๋น„ํšจ์œจ์„ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด ํŠธ๋ฆฌ๋ฅผ Rebalancingํ•˜๋Š” ๊ธฐ๋ฒ•๋“ค์ด ์žˆ๋Š”๋ฐ, ๊ทธ ์ค‘์—์„œ ๋Œ€ํ‘œ์ ์ธ ๊ฒƒ์ด ๋ฐ”๋กœ Red-Black Tree์ด๋‹ค.

 

 

โ—ป๏ธ Binary Heap

   Tree ์ค‘์—์„œ๋„ ๋ฐฐ์—ด์— ๊ธฐ๋ฐ˜ํ•œ Complete Binary Tree์˜ ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค.

   ์ตœ๋Œ€ํž™(Max Heap)๊ณผ ์ตœ์†Œํž™(Min Heap)์ด ์žˆ๋‹ค. ์ตœ๋Œ€ํž™์˜ ๊ฒฝ์šฐ ๊ฐ ๋…ธ๋“œ์˜ ๊ฐ’์ด childeren์˜ ๊ฐ’๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™์€ ์™„์ „ ์ด์ง„ ํŠธ๋ฆฌ๋ฅผ ๋œปํ•˜๋ฉฐ, ์ตœ์†Œํž™์€ ๊ทธ ๋ฐ˜๋Œ€๋ฅผ ์˜๋ฏธํ•œ๋‹ค. 

   ๊ฐ์ž ์ตœ๋Œ€๊ฐ’, ์ตœ์†Œ๊ฐ’์„ ์ฐพ๋Š”๋ฐ์—๋Š” O(1)์˜ ๋น ๋ฅธ ์†๋„๋ฅผ ๋ณด์ด์ง€๋งŒ, ๊ฐ’์„ ์‚ฝ์ž…/์‚ญ์ œ๋ฅผ ํ•  ๋•Œ์—๋Š” ํŠธ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์žฌ๊ตฌ์„ฑ ํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— O(logN)์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๋ณด์ธ๋‹ค.

 

 

โ—ป๏ธ Red Black Tree

 BST๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ํŠธ๋ฆฌ ํ˜•์‹์˜ ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค. ํŠน์ • ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜์— ๋Œ€ํ•˜์—ฌ depth๋ฅผ ์ตœ์†Œํ™”ํ•˜์—ฌ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ์ค„์ด๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ์œผ๋กœ, Complete binary tree์ธ ๊ฒฝ์šฐ๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ๋”ฐ๋ผ์„œ Search, Insert, Delete์˜ ๊ฒฝ์šฐ์— O(logN)์˜ ์ผ๊ด€์ ์ธ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๋ณด์ธ๋‹ค.

 ์ •์˜๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

  • ๊ฐ ๋…ธ๋“œ๋Š” Red/Black์˜ ์ƒ‰๊น”์„ ๊ฐ–๋Š”๋‹ค.
  • Root node์˜ ์ƒ‰๊น”์€ Black์ด๋‹ค.
  • ๊ฐ Leaf node์˜ ์ƒ‰๊น”์€ Black์ด๋‹ค.
  • ์–ด๋–ค ๋…ธ๋“œ์˜ ์ƒ‰๊น”์ด red๋ผ๋ฉด, ๋‘ ๊ฐœ์˜ children์˜ ์ƒ‰๊น”์€ ๋ชจ๋‘ Black์ด๋‹ค.
  • ๊ฐ ๋…ธ๋“œ์— ๋Œ€ํ•ด์„œ ๋…ธ๋“œ๋กœ๋ถ€ํ„ฐ descendant leaves๊นŒ์ง€์˜ ๋‹จ์ˆœ ๊ฒฝ๋กœ๋Š” ๋ชจ๋‘ ๊ฐ™์€ ์ˆ˜์˜ black nodes๋“ค์„ ํฌํ•จํ•˜๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค. ์ด๋ฅผ ํ•ด๋‹น ๋…ธ๋“œ์˜ Black-Height๋ผ๊ณ  ํ•œ๋‹ค.

์‚ฝ์ž…/์‚ญ์ œ์˜ ์›๋ฆฌ๋ฅผ ์•Œ์•„๋‘๋Š” ๊ฒƒ๋„ ์ข‹์„ ๋“ฏ ํ•˜๋‹ค.

 

 

 

 

 

๐Ÿ’™ ๐Ÿ’™ ๐Ÿ’™

 

 

โ—ป๏ธ Hash Table

 Hashing์€ ํŠน์ •ํ•œ ๊ณ„์‚ฐ์„ ํ†ตํ•˜์—ฌ ๋‚˜์˜จ ๊ฐ’์„ ํ‚ค๋กœ ํ•˜์—ฌ ๊ฐ’์— ์ ‘๊ทผํ•˜๋Š” ๊ณผ์ •์ด๋‹ค. Hash Table๊ณผ Hash Function์œผ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.

 Hash Table์€ Key์™€ Value๋ฅผ ๊ฐ–๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค. ๋‚ด๋ถ€์ ์œผ๋กœ ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋น ๋ฅธ ๊ฒ€์ƒ‰ ์†๋„๋ฅผ ๊ฐ–๋Š”๋‹ค. ์ฆ‰, ํŠน์ • ๊ฐ’์„ ๊ฒ€์ƒ‰ํ•˜๋Š”๋ฐ ์žˆ์–ด ๋ฐ์ดํ„ฐ ๊ณ ์œ ์˜ ์ธ๋ฑ์Šค๋ฅผ ์“ฐ๋ฏ€๋กœ Time Complexity๊ฐ€ O(1)์ด ๋˜๋Š” ๊ฒƒ์ด๋‹ค. ๋‹ค๋งŒ ์ธ๋ฑ์Šค๋กœ ์‚ฌ์šฉ๋˜๋Š” key๊ฐ’์ด ๋ถˆ๊ทœ์น™ํ•˜๋ฏ€๋กœ ์ด๋ฅผ ๋‹ค๋ฃจ๋Š”๋ฐ ์žˆ์–ด ํŠน๋ณ„ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ์ด๋ค„์ง„ Hash Function์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค.

   Hash Function์ด ๋ฆฌํ„ดํ•˜๋Š” ๊ฐ’์„ Hashcode๋ผ๊ณ  ํ•˜๋Š”๋ฐ, ์ด ํ‚ค ๊ฐ’์ด ๋™์ผํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ Collision์ด ๋ฐœ์ƒํ•œ๋‹ค. Collision์„ ์ตœ์†Œํ™”ํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ์„ค๊ฒŒ๋œ ๊ฒƒ์„ ์ข‹์€ Hash Function์ด๋ผ๊ณ  ํ•œ๋‹ค.  ์ด๋ฅผ ์œ„ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ๊ฒƒ๋“ค์ด ์žˆ๋‹ค.

  • Open Address ๋ฐฉ์‹ (๊ฐœ๋ฐฉ์ฃผ์†Œ๋ฒ•)
    • ์„ ํ˜• ํƒ์ƒ‰ (Linear Probing): ํ•ด์‹œ์ถฉ๋Œ ์‹œ ๋‹ค์Œ ๋ฒ„์ผ“์ด๋‚˜ ๋ช‡ ๊ฐœ์˜ ์œ„์น˜๋ฅผ ๊ฑด๋„ˆ๋›ฐ์–ด ๋นˆ ๊ณณ์— ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…ํ•˜๋Š” ํƒ์ƒ‰๋ฒ•์ด๋‹ค.
    • ์ œ๊ณฑ ํƒ์ƒ‰ (Quadratic Probing): ํ•ด์‹œ์ถฉ๋Œ ์‹œ ์ œ๊ณฑ๋งŒํผ ๊ฑด๋„ˆ๋›ด ๋ฒ„์ผ“์— ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…ํ•˜๋Š” ํƒ์ƒ‰๋ฒ•์ด๋‹ค.
    • ์ด์ค‘ ํ•ด์‹œ (Double hashing probing): ํ•ด์‹œ์ถฉ๋Œ ์‹œ ๋‹ค๋ฅธ ํ•ด์‹œํ•จ์ˆ˜๋ฅผ ํ•œ ๋ฒˆ ๋” ์ ์šฉํ•œ ๊ฒฐ๊ณผ๋ฅผ ์ด์šฉํ•œ๋‹ค. ํ•ด์‹œ์—ฐ์‚ฐ์„ ๋‘๋ฒˆ ํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ๋Šฅ์ ์œผ๋กœ ์ข‹์ง€ ์•Š๋‹ค. 
    • ๊ฐœ๋ฐฉ์ฃผ์†Œ๋ฒ•์€ ์‚ญ์ œ์˜ ๊ฒฝ์šฐ ์ถฉ๋Œ์— ์˜ํ•ด ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ๊ฒ€์ƒ‰๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์‚ญ์ œ์œ„์น˜์— ๋‹ค์Œ์œ„์น˜๊นŒ์ง€ ์—ฐ๊ฒฐํ•ด์ฃผ๋Š” ๋”๋ฏธ๋…ธ๋“œ๋ฅผ ์‚ฝ์ž…ํ•ด์•ผํ•œ๋‹ค. ๋”๋ฏธ๋…ธ๋“œ๊ฐ€ ๋งŽ์•„์ง€๋ฉด ๋ฒ„ํ‚ท์„ ์—ฐ์†์ ์œผ๋กœ ๊ฒ€์ƒ‰ํ•ด์•ผํ•˜๋ฏ€๋กœ ์ผ์ • ๊ฐœ์ˆ˜ ์ด์ƒ์ด ๋˜์—ˆ์„ ๊ฒฝ์šฐ ์žฌํ•ด์‹œ๋ฅผ ํ•ด์ค˜์•ผ ์„ฑ๋Šฅ ์œ ์ง€๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.
    • ํฌ์ธํ„ฐ๊ฐ€ ํ•„์š”์—†๊ณ  ์ง€์ •ํ•œ ๋ฉ”๋ชจ๋ฆฌ ์™ธ ์ถ”๊ฐ€์ ์ธ ์ €์žฅ๊ณต๊ฐ„์ด ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค. ์‚ฝ์ž…/์‚ญ์ œ์‹œ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋” ์ ์–ด ๋ฐ์ดํ„ฐ๊ฐ€ ์ ์„ ๋•Œ ๋” ์œ ๋ฆฌํ•˜๋‹ค.
  • Chaining ๋ฐฉ์‹ (์ฒด์ด๋‹)
    • ๋ฒ„์ผ“์— ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋ฅผ ํ• ๋‹นํ•˜์—ฌ, ๋ฒ„์ผ“์—์„œ ํ•ด์‹œ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•˜๋ฉด ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋กœ ๋ฐ์ดํ„ฐ๋“ค์„ ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.
    • ๋ฒ„์ผ“์ด ๊ฝ‰ ์ฐจ๋”๋ผ๋„ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋กœ ๋Š˜๋ ค๊ฐ€๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ์˜ ์ฃผ์†Œ๊ฐ’์ด ๋ณ€ํ•˜์ง€ ์•Š๋Š”๋‹ค.
    • ๊ฐœ๋ฐฉ์ฃผ์†Œ๋ฒ•์— ๋น„ํ•ด ๋ณต์žกํ•œ ๊ณ„์‚ฐ์‹์ด ํ•„์š”ํ•˜์ง€ ์•Š์œผ๋‚˜, ํ•ด์‹œํ…Œ์ด๋ธ”์ด ์ฑ„์›Œ์งˆ์ˆ˜๋ก ์„ฑ๋Šฅ์ €ํ•˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
  • ๋ฆฌ์‚ฌ์ด์ง•
    • ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์— ๊ธฐ์กด ๋ฐฐ์—ด์˜ ํ‚ค๋ฅผ ์ƒˆ๋กญ๊ฒŒ ์žฌํ•ด์‹ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.
    • ๊ฐœ๋ฐฉ์ฃผ์†Œ๋ฒ•์—์„œ ๊ณ ์ •ํฌ๊ธฐ์˜ ๋ฐฐ์—ด์ด ๊ฝ‰ ์ฐจ๊ฑฐ๋‚˜, ์ฒด์ด๋‹์—์„œ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ์˜ ๊ธธ์ด๊ฐ€ ๊ธธ์–ด์ง€๊ฒŒ ๋˜๋ฉด ๊ฒ€์ƒ‰ ํšจ์œจ์ด ๋–จ์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์— ๋ฒ„ํ‚ท์˜ ๊ฐœ์ˆ˜๋ฅผ ๋Š˜๋ ค์ฃผ๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

 

 

 

๐Ÿ’™ ๐Ÿ’™ ๐Ÿ’™

 

 

โ—ป๏ธ Graph

 ํŠธ๋ฆฌ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋น„์„ ํ˜• ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค. ํŠธ๋ฆฌ๋Š” ์‚ฌ์ดํด์ด ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ทธ๋ž˜ํ”„์ด๋‹ค.

 ๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„(Directed Graph)/ ๋ฐฉํ–ฅ์ด ์—†๋Š” ๊ทธ๋ž˜ํ”„(Undireted Graph)/ ๊ฐ€์ค‘์น˜ ๊ทธ๋ž˜ํ”„(Weight Graph)/ ๋น„๊ฐ€์ค‘์น˜ ๊ทธ๋ž˜ํ”„/ ๋ถ€๋ถ„ ๊ทธ๋ž˜ํ”„(Sub Graph)์™€ ๊ฐ™์€ ์ข…๋ฅ˜๊ฐ€ ์žˆ๋‹ค.

 

 ๊ทธ๋ž˜ํ”„๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” ์ธ์ ‘ ํ–‰๋ ฌ(Adjacent Matrix) ๋˜๋Š” ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ(Adjacent List)๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์žˆ๋‹ค.

  • ์ธ์ ‘ ํ–‰๋ ฌ(Adjacent Matrix): vertex ๊ฐ„์˜ ์—ฐ๊ฒฐ๊ด€๊ณ„๋ฅผ O(1)๋กœ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋‹จ, Space Complexity๊ฐ€ O(V^2)์ด ๋ฐœ์ƒํ•˜๋ฏ€๋กœ Dense graph ํ‘œํ˜„์— ์ ํ•ฉํ•˜๋‹ค.
  • ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ(Adjacent List): vertex๊ฐ„์˜ ์—ฐ๊ฒฐ๊ด€๊ณ„๋ฅผ ํ™•์ธํ•˜๋Š”๋ฐ ์˜ค๋ž˜ ๊ฑธ๋ฆฐ๋‹ค. Space Complexity๋Š” O(V+E)๋กœ Sparse Graph๋ฅผ ํ‘œํ˜„ํ•˜๋Š”๋ฐ ์ข‹๋‹ค.

 ๊ทธ๋ž˜ํ”„๋ฅผ ํƒ์ƒ‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ๋“ค์ด ์žˆ๋‹ค.

  • ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰ (Depth First Search: DFS): Stack
  • ๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰ (Breadth First Search: BFS): Queue

 

โ—ป๏ธ ์ตœ์†Œ์‹ ์žฅํŠธ๋ฆฌ MST(Minimum Spanning Tree)

๊ทธ๋ž˜ํ”„ G์—์„œ edge weight์˜ ํ•ฉ์ด ์ตœ์†Œ์ธ Spanning Tree(๊ทธ๋ž˜ํ”„ G์˜ ๋ชจ๋“  vertex๊ฐ€ cycle์—†์ด ์—ฐ๊ฒฐ๋œ ํ˜•ํƒœ)๋ฅผ ์˜๋ฏธํ•œ๋‹ค. 

  • Kruskal Algorithm
    • ๋ชจ๋“  ๊ฐ„์„ ๋“ค์„ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•œ ๋‹ค์Œ, ์ตœ์†Œ ๊ฐ€์ค‘์น˜๋ฅผ ๋ณด์ด๋Š” ๊ฐ„์„ ๋ถ€ํ„ฐ ์„ ํƒํ•˜๋ฉฐ ์ŠคํŒจ๋‹ ํŠธ๋ฆฌ๋ฅผ ๋งŒ๋“ค์–ด๊ฐ€๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค. ๊ฐ„์„  ์„ ํƒ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ๋‹ค.
  • Prim Algorithm
    • ์‹œ์ž‘ ์ •์ ์„ ๊ธฐ์ค€์œผ๋กœ ๊ฐ€์žฅ ๊ฐ€์ค‘์น˜๊ฐ€ ์ ์€ ๊ฐ„์„ ์œผ๋กœ ์—ฐ๊ฒฐ๋œ ์ •์ ์„ ์„ ํƒํ•˜๋ฉฐ ์‹ ์žฅ ํŠธ๋ฆฌ๋ฅผ ํ™•์žฅ์‹œํ‚ค๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค. ์ •์  ์„ ํƒ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ๋‹ค.

 

 

 

 

 

๐Ÿ’™ ๐Ÿ’™ ๐Ÿ’™

 

 

๐Ÿ“ CS ์งˆ๋ฌธ ์ •๋ฆฌ

 

   1. ํ•ด์‹œ ํ…Œ์ด๋ธ”์ด๋ž€ ๋ฌด์—‡์ธ๊ฐ€? ํ•ด์‹œ ํ…Œ์ด๋ธ”์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” ์–ด๋–ป๊ฒŒ ๋˜๋Š”๊ฐ€?

   >> ํ•ด์‹œ ํ…Œ์ด๋ธ”์€ (Key, Value)์Œ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ ์ค‘ ํ•˜๋‚˜์ด๋‹ค. ๋‚ด๋ถ€์ ์œผ๋กœ ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜์—ฌ ์ €์žฅ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ์˜ ์ ‘๊ทผ์ด O(1)๋กœ ๋ฌด์ฒ™์ด๋‚˜ ๋น ๋ฅด๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ index์— ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ, ์ถ”๊ฐ€์ ์ธ ์กฐํšŒ๋ฅผ ์œ„ํ•ด Time Complexity๊ฐ€ O(N)๊นŒ์ง€ ์ฆ๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

   2. ArrayList์™€ Linked List์˜ ์ฐจ์ด๋Š” ๋ฌด์—‡์ธ๊ฐ€.

   >> ArrayList๋Š” ๋ฐ์ดํ„ฐ๋“ค์ด ์ˆœ์„œ๋Œ€๋กœ ๋Š˜์–ด์„  ๋ฐฐ์—ด์˜ ํ˜•ํƒœ๋ฅผ, Linked List๋Š” ์ž๋ฃŒ์˜ ์ฃผ์†Œ๊ฐ’์œผ๋กœ ์„œ๋กœ ์—ฐ๊ฒฐ๋œ ํ˜•์‹์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. 

  • ArrayList: ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ์— ๋ฌด์ž‘์œ„๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ฆฌ์ŠคํŠธ์˜ ํฌ๊ธฐ๊ฐ€ ์ œํ•œ๋˜์–ด ์žˆ์œผ๋ฉฐ ์ด๋ฅผ ์žฌ์กฐ์ •ํ•˜๋Š” ๋ฐ์—๋Š” ๋งŽ์€ ์—ฐ์‚ฐ์ด ํ•„์š”ํ•˜๋‹ค. ๋˜ํ•œ ์‚ฝ์ž…/์‚ญ์ œ์˜ ๊ฒฝ์šฐ ์ž„์‹œ๋ฐฐ์—ด์„ ์ƒ์„ฑํ•˜์—ฌ ๋ณต์ œํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฐ๋‹ค.
  • LinkedList: ๋ฆฌ์ŠคํŠธ์˜ ํฌ๊ธฐ์— ์˜ํ–ฅ์—†์ด ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค. ์‚ฝ์ž…/์‚ญ์ œ์˜ ๊ฒฝ์šฐ ์ธ์ ‘ ๋ฐ์ดํ„ฐ์˜ ๋งํฌ๋งŒ ๋ณ€๊ฒฝํ•˜๋ฉด ๋˜๋ฏ€๋กœ ์‹œ๊ฐ„์ด ๋งค์šฐ ๋น ๋ฅด๋‹ค. ๋‹จ, ๋ฌด์ž‘์œ„ ์ ‘๊ทผ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ ๋ฐ์ดํ„ฐ ์กฐํšŒ์‹œ ์ˆœ์ฐจ์ ‘๊ทผ์„ ํ•ด์•ผํ•˜๋ฏ€๋กœ ์—ฌ๊ธฐ์— ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฐ๋‹ค.

 

   3. ํ์™€ ์Šคํƒ์˜ ๊ตฌํ˜„์— ์ข‹์€ ์ž๋ฃŒ๊ตฌ์กฐ๋Š”?

   >> ํ๋Š” List, ์Šคํƒ์€ Array

  • ํ(Queue): Array ๊ตฌํ˜„์‹œ poll ์—ฐ์‚ฐ ์ดํ›„ ๊ฐ์ฒด๋ฅผ ์•ž๋‹น๊ธฐ๋Š” ์ž‘์—…์ด ํ•„์š”ํ•˜๋‹ค. ํ•˜์ง€๋งŒ List๋กœ ๊ตฌํ˜„ํ•˜๋ฉด ๊ฐ์ฒด 1๊ฐœ๋งŒ ์ œ๊ฑฐํ•˜๋ฉด ๋˜๋ฏ€๋กœ ์‚ฝ์ž…/์‚ญ์ œ๊ฐ€ ์šฉ์ดํ•œ Linked List๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.
  • ์Šคํƒ(Stack): List๋กœ ๊ตฌํ˜„ํ•˜๋ฉด ๊ฐ์ฒด๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ์ž‘์—…์ด ํ•„์š”ํ•˜๋‹ค. ํ•˜์ง€๋งŒ Array๋กœ ๊ตฌํ˜„ํ•˜๋ฉด index๋งŒ ์ค„์ด๊ณ  ์ดˆ๊ธฐํ™”ํ•˜๋ฉด ๋˜๋ฏ€๋กœ ์‚ญ์ œ ์ž‘์—…์„ ํ•  ํ•„์š”๊ฐ€ ์—†์–ด์ง„๋‹ค. ๋”ฐ๋ผ์„œ Array๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. 

 

   4. ํฌํ™” ์ด์ง„ํŠธ๋ฆฌ, ์™„์ „ ์ด์ง„ํŠธ๋ฆฌ, ์ • ์ด์ง„ํŠธ๋ฆฌ์˜ ์ฐจ์ด์ ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜์‹œ์˜ค.

 

   5. ํž™์˜ ์ž๋ฃŒ๊ตฌ์กฐ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜์‹œ์˜ค.

 

   6. ๊ทธ๋ž˜ํ”„์™€ ํŠธ๋ฆฌ์˜ ์ฐจ์ด์ ์€ ๋ฌด์—‡์ธ๊ฐ€?

 

   7. ์ตœ์†Œ์‹ ์žฅํŠธ๋ฆฌ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜์‹œ์˜ค.

 

    8. ๊ทธ๋ž˜ํ”„๋ฅผ ํƒ์ƒ‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ๋ฌด์—‡์ด ์žˆ๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ๊ฐ๊ฐ์˜ ํŠน์„ฑ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜์‹œ์˜ค.

 

 

 

 

 

 

 

 

 

 

 

   

๐Ÿ’Ž ๐Ÿ’Ž ๐Ÿ’Ž

 

 

๏ผฐ๏ฝ๏ฝ“๏ฝ”๏ฝ…๏ฝ„ ๏ผข๏ฝ™ ๏ผณ๏ผก๏ผน

๐˜›๐˜ฉ๐˜ข๐˜ฏ๐˜ฌ๐˜ด ๐˜ง๐˜ฐ๐˜ณ ๐˜ณ๐˜ฆ๐˜ข๐˜ฅ๐˜ช๐˜ฏ๐˜จ