Computer Science๐Ÿงช/Data Structure, Algorithmโ›“๏ธ

[Algorithm] ์‹œ๊ฐ„๋ณต์žก๋„์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ธฐ

JanuDev 2025. 12. 10. 11:14

์•„๋ฌด๋ฆฌ ์‚ฌ๊ต์œก์„ ํ”๋“ค์–ด ์ œ๊ปด๋„ ์ˆ˜ํ•™์„ 70์ ์„ ๋„˜์–ด๋ณธ ์ ์ด ์—†๋Š” ๋‚ด๊ฐ€ ๋„ˆ๋ฌด ์–ด๋ ค์›Œ์„œ ์ž‘์„ฑํ•˜๋Š” ๊ธ€

์‚ฌ์‹ค log๋„ ๋ญ”์ง€ ์ž˜ ๋ชจ๋ฆ„... ์–ด์นด์ง€

๋”๋ณด๊ธฐ

๋กœ๊ทธ(log) : ์–ด๋–ค ์ˆ˜๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ๋ฐ‘์„ ๋ช‡ ๋ฒˆ ๊ฑฐ๋“ญ์ œ๊ณฑํ•ด์•ผ ํ•˜๋Š”์ง€๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ˆ˜ํ•™์  ๊ฐœ๋… 
\(a^x = n \) ์—์„œ \(x\)๋ฅผ \(log_a(n)\)๋กœ ํ‘œํ˜„ํ•œ๋‹ค.

1. ์‹œ๊ฐ„๋ณต์žก๋„ ์ •์˜

์‹œ๊ฐ„๋ณต์žก๋„๋ž€ ์ž…๋ ฅ๊ฐ’(N)์ด ์ปค์งˆ์ˆ˜๋ก ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์ˆ˜ํ–‰ ์‹œ๊ฐ„์ด ์–ผ๋งˆ๋‚˜ ๋นจ๋ผ์ง€๊ฑฐ๋‚˜ ๋А๋ ค์ง€๋Š”์ง€ ํ™•์ธํ•˜๋Š” ์ง€ํ‘œ๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

์ž…๋ ฅ ํฌ๊ธฐ n์ด ์ฆ๊ฐ€ํ•จ์— ๋”ฐ๋ผ ์—ฐ์‚ฐ ํšŸ์ˆ˜๊ฐ€ ์ฆ๊ฐ€ํ•˜๋Š” ์ฆ๊ฐ€์œจ(Growth Rate)๋ฅผ ์ˆ˜ํ•™์ ์œผ๋กœ ํ‘œ๊ธฐํ•œ๋‹ค. ์ด ์ฆ๊ฐ€์œจ์„ ์ ๊ทผ์  ํ‘œ๊ธฐ๋ฒ•(Aysmptotic Notation)์„ ์‚ฌ์šฉํ•˜๋Š”๋ฐ, ๊ฐœ๋ฐœ์—์„  ๋Œ€๋ถ€๋ถ„ ๋น…์˜ค(Big-O)ํ‘œ๊ธฐ๋ฒ•์„ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค.

ํ‘œ๊ธฐ๋ฒ• ๊ธฐํ˜ธ ์˜๋ฏธ ์šฉ๋„
Big-O O ์ตœ์•…์˜ ๊ฒฝ์šฐ(์ƒํ•œ) ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์„ฑ๋Šฅ ๋ณด์žฅ์„ ์œ„ํ•ด ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ
Big-Omega Ω ์ตœ์„ ์˜ ๊ฒฝ์šฐ(ํ•˜ํ•œ) ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์•„๋ฌด๋ฆฌ ๋นจ๋ผ๋„ ์ด๋ณด๋‹จ ๋А๋ฆด ์ˆ˜ ์—†์Œ์„ ๋‚˜ํƒ€๋ƒ„
Big-Theta  θ ํ‰๊ท ์ ์ธ ๊ฒฝ์šฐ ์ตœ์„ ๊ณผ ์ตœ์•…์˜ ๊ฒฝ์šฐ๊ฐ€ ๋™์ผํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ์‚ฌ์šฉ

์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ์•Œ๋ฉด ์–ด๋–ค ๊ฒƒ์ด ๋” ๋น ๋ฅธ ์ฝ”๋“œ์ธ์ง€, ์–ด๋””๋ฅผ ๊ฐœ์„ ํ•ด์•ผ ํ•˜๋Š”์ง€ ํŒ๋‹จํ•  ์ˆ˜ ์žˆ๋‹ค.

 

2. ์ข…๋ฅ˜์™€ ํŠน์ง•

์ฃผ์š” ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” ์ž…๋ ฅํฌ๊ธฐ n์— ๋Œ€ํ•œ ์—ฐ์‚ฐ ํšŸ์ˆ˜์™€ ์ฆ๊ฐ€์œจ์— ๋”ฐ๋ผ ๋ถ„๋ฅ˜๋œ๋‹ค. ์ฆ๊ฐ€์œจ์ด ๋‚ฎ์„ ์ˆ˜๋ก(= ๊ทธ๋ž˜ํ”„๊ฐ€ ๊ฐ€ํŒŒ๋ฅด์ง€ ์•Š์„์ˆ˜๋ก) ๋” ์ข‹์€ ์„ฑ๋Šฅ์„ ์˜๋ฏธํ•œ๋‹ค.

 

1. \(O(1)\)

  • ๋ช…์นญ : ์ƒ์ˆ˜ ์‹œ๊ฐ„(Constant)
  • ํŠน์ง• : ์ž…๋ ฅ ํฌ๊ธฐ์™€ ์ƒ๊ด€ ์—†์ด ์‹คํ–‰์‹œ๊ฐ„์ด ์ผ์ •ํ•˜๋ฉฐ, ๊ฐ€์žฅ ๋น ๋ฆ„
  • ์˜ˆ์‹œ : ๋ฐฐ์—ด์—์„œ ์ธ๋ฑ์Šค๋ฅผ ํ†ตํ•œ ์š”์†Œ ์ ‘๊ทผ, ํ•ด์‹œ ํ…Œ์ด๋ธ” ์กฐํšŒ - ์ƒ์ˆ˜

2. \(O(log n)\)

  • ๋ช…์นญ : ๋กœ๊ทธ ์‹œ๊ฐ„(Logarithmic)
  • ํŠน์ง• : ์ž…๋ ฅ ํฌ๊ธฐ๊ฐ€ ์ฆ๊ฐ€ํ•  ๋•Œ ์‹คํ–‰ ์‹œ๊ฐ„์€ ๋งค์šฐ ๋А๋ฆฌ๊ฒŒ ์ฆ๊ฐ€
  • ์˜ˆ์‹œ : ์ด์ง„ ํƒ์ƒ‰(Binary Search) - ์ด๋ถ„ ํƒ์ƒ‰

3. \(O(n)\)

  • ๋ช…์นญ : ์„ ํ˜• ์‹œ๊ฐ„(Linear)
  • ํŠน์ง• : ์ž…๋ ฅ ํฌ๊ธฐ์™€ ์‹คํ–‰ ์‹œ๊ฐ„์ด ์ •๋น„๋ก€ํ•˜์—ฌ ์ฆ๊ฐ€ํ•จ
  • ์˜ˆ์‹œ : for๋ฃจํ”„๋ฅผ ํ•œ๋ฒˆ ๋Œ๋ฉฐ ๋ฐฐ์—ด ์ „์ฒด๋ฅผ ์ˆœํšŒ - ํ•œ๋ฒˆ ํ›‘๊ธฐ

4. \(O(n \log n)\)

  • ๋ช…์นญ : ์„ ํ˜• ๋กœ๊ทธ ์‹œ๊ฐ„(Linearithmic)
  • ํŠน์ง• : \(O(n)\) ๋ณด๋‹ค ๋А๋ฆฌ์ง€๋งŒ \(O(n^2) \) ๋ณด๋‹จ ๋น ๋ฆ„. ์‹ค์šฉ์ ์œผ๋กœ ์ข‹์€ ์„ฑ๋Šฅ์œผ๋กœ ๊ฐ„์ฃผ๋จ
  • ์˜ˆ์‹œ : ๋ณ‘ํ•ฉ ์ •๋ ฌ(Merge Sort), ํ€ต ์ •๋ ฌ(Quick Sort) - ํšจ์œจ์  ์ •๋ ฌ

5. \(O(n^2)\)

  • ๋ช…์นญ : ์ œ๊ณฑ ์‹œ๊ฐ„(Quadratic)
  • ํŠน์ง• : ์‹คํ–‰ ์‹œ๊ฐ„์ด ์ž…๋ ฅ ํฌ๊ธฐ์˜ ์ œ๊ณฑ์— ๋น„๋ก€ํ•˜์—ฌ ์ฆ๊ฐ€ํ•จ. ๋А๋ฆฐ ํŽธ
  • ์˜ˆ์‹œ : ์ด์ค‘ for ๋ฃจํ”„(Nested loops), ๋ฒ„๋ธ” ์ •๋ ฌ(Bubble Sort), ์„ ํƒ ์ •๋ ฌ(Selection Sort) - ๋‘๊ฒน ๋ฐ˜๋ณต

6. \(O(2^n)\)

  • ๋ช…์นญ : ์ง€์ˆ˜ ์‹œ๊ฐ„(Exponential)
  • ํŠน์ง• : ์ž…๋ ฅ ํฌ๊ธฐ๊ฐ€ ์กฐ๊ธˆ๋งŒ ์ปค์ ธ๋„ ์‹คํ–‰ ์‹œ๊ฐ„์ด ๊ธฐํ•˜๊ธ‰์ˆ˜์ ์œผ๋กœ ๋Š˜์–ด๋‚จ. ๋น„ํšจ์œจ์ 
  • ์˜ˆ์‹œ : ์žฌ๊ท€๋ฅผ ์ด์šฉํ•œ ํŒŒ๋ณด๋‚˜์น˜ ์ˆ˜์—ด, ์ผ๋ถ€ Brute-Force ๋ฐฉ์‹ - ์ž‘์€ n์—์„œ๋งŒ ์‚ฌ์šฉ

7. \(O(n!)\)

  • ๋ช…์นญ : ํŒฉํ† ๋ฆฌ์–ผ ์‹œ๊ฐ„(Factorial)
  • ํŠน์ง• : \(O(2^n)\) ๋ณด๋‹ค ํ›จ์”ฌ ๋น ๋ฅด๊ฒŒ ์ฆ๊ฐ€ํ•จ. ๋งค์šฐ ๋น„ํšจ์œจ์ 
  • ์˜ˆ์‹œ : ์ˆœ์—ด์„ ๊ณ„์‚ฐํ•˜๋Š” ๋ชจ๋“  ๋ฌธ์ œ - ์ž‘์€ n์—์„œ๋งŒ ์‚ฌ์šฉ

๊ฐœ๋ฐœ์ž๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ \(O(n \log n)\) ์ดํ•˜์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ€์ง„ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์„ค๊ณ„ํ•˜๊ฑฐ๋‚˜ ์„ ํƒํ•œ๋‹ค. \(O(n^2)\) ์ด์ƒ์€ ์ž…๋ ฅ ํฌ๊ธฐ๊ฐ€ ์ž‘์€ ๊ฒฝ์šฐ์—๋งŒ ํ—ˆ์šฉ๋œ๋‹ค.

 

3. ์ฝ”๋“œ์—์„œ ์‹œ๊ฐ„๋ณต์žก๋„ ๋ณด๋Š”๋ฒ•

ํ•œ์ค„ ํ•œ์ค„์ด ์ค‘์š”ํ•œ ๊ฒƒ์ด ์•„๋‹Œ, ์ „์ฒด ํ๋ฆ„์ด N๊ณผ ์–ด๋–ป๊ฒŒ ๊ด€๊ณ„๋˜๋Š”์ง€๊ฐ€ ํ•ต์‹ฌ์ด๋‹ค.

  1. ๋ฐ˜๋ณต๋ฌธ์ด ๋ช‡๊ฒน์ธ์ง€ ๋ณด๊ธฐ
  2. ๋ฐ˜๋ณต ๋ฒ”์œ„๊ฐ€ N์— ๋”ฐ๋ผ ๋ณ€ํ•˜๋Š”์ง€ ๋ณด๊ธฐ
  3. ์žฌ๊ท€ ํ•จ์ˆ˜๊ฐ€ N์„ ์–ด๋–ป๊ฒŒ ์ค„์—ฌ๊ฐ€๋ฉฐ ํ˜ธ์ถœ๋˜๋Š”์ง€ ๋ณด๊ธฐ
  4. ์ •๋ ฌ์ด๋‚˜ ํƒ์ƒ‰์ด ์„ž์—ฌ์žˆ๋‹ค๋ฉด ํŠน์„ฑ์„ ํŒŒ์•…ํ•˜๊ธฐ

์˜ˆ์‹œ

1๏ธโƒฃ ๋ฐ˜๋ณต๋ฌธ์ด ๋ช‡๊ฒน์ธ๊ฐ€

\(O(n)\) : ๋ฐ˜๋ณต๋ฌธ ํ•œ ๊ฒน

void printNum(int N) {
  for (int i = 0; i < N, i++) {
   System.out.println(i);  // ์ž…๋ ฅ์ด ์ปค์ง€๋ฉด ๋ฐ˜๋ณต ํšŸ์ˆ˜๋„ N๋งŒํผ ์ฆ๊ฐ€
  }
}

 

\(O(n^2)\) : ๋ฐ˜๋ณต๋ฌธ ๋‘ ๊ฒน

void nestedLoop(int N) {
  for (int i = 0; i < N; i++) {
    for (int j = 0; j < N; j++) {
      System.out.println(i + ", " + j);
    }
  }  
}

์ด ์‹คํ–‰ ํšŸ์ˆ˜ : N * N =  \(O(n^2)\)

 

2๏ธโƒฃ ๋ฐ˜๋ณต ๋ฒ”์œ„๊ฐ€ N์— ๋”ฐ๋ผ ์–ด๋–ป๊ฒŒ ๋ณ€ํ•˜๋Š”๊ฐ€

\(O(1)\) : ๋ฒ”์œ„๊ฐ€ ๊ณ ์ •

void constantLoop () {
  for (int i = 0; i < 100; i++) {
    System.out.println(i);
  }
}

์ž…๋ ฅ ํฌ๊ธฐ์™€ ์ƒ๊ด€ ์—†์ด ์‹คํ–‰ ํšŸ์ˆ˜๊ฐ€ ํ•ญ์ƒ 100๋ฒˆ = \(O(1)\) 

 

\(O(log n)\) : ๋ฒ”์œ„๊ฐ€ ์ ˆ๋ฐ˜์”ฉ ์ค„์–ด๋“ฆ = ์ด๋ถ„ ํŒจํ„ด

void halfLoop (int N) {
  while (N > 1) {
   N = N / 2;
  }
}

๋งค๋ฒˆ ์ž…๋ ฅ์„ ๋ฐ˜์œผ๋กœ ์ค„์ธ๋‹ค. ์ด๊ฒŒ ์ด์ง„ ํƒ์ƒ‰์˜ ์›๋ฆฌ

 

3๏ธโƒฃ ์žฌ๊ท€ ํ•จ์ˆ˜๊ฐ€ N์„ ์–ด๋–ป๊ฒŒ ์ค„์—ฌ๊ฐ€๋Š”๊ฐ€

\(O(n)\) : ํ•œ ๋‹จ๊ณ„์”ฉ ์ค„์–ด๋“œ๋Š” ์„ ํ˜• ์žฌ๊ท€

void linearRecursion (int n) {
  if (n == 0) {
    linearRecursion(n-1);
  }
}

n → n-1 → n-2 → n-3 ..... → 0

n๋ฒˆ ํ˜ธ์ถœ๋จ = \(O(n)\)

 

\(O(log n)\)  : ์ด์ง„ ํƒ์ƒ‰ ์žฌ๊ท€

int binarySearch (int[] arr, int target, int left, int right) {
  if (left > right) return -1;
  
  int mid = (left + right) / 2;
  
  if (arr[mid] === target) return mid;
  if (arr[mid] < target) {
    // arr[mid]๊ฐ€ target๋ณด๋‹ค ์ž‘๋‹ค๋ฉด ์™ผ์ชฝ์—์„œ +1์นธ ์ด๋™
    return binarySearch(arr, target, mid + 1, right); 
  } else {
    // arr[mid]๊ฐ€ target๋ณด๋‹ค ํฌ๋ฉด ์˜ค๋ฅธ์ชฝ์—์„œ -1์นธ ์ด๋™
    return binarySearch(arr, target, left, mid - 1);
  }
}

// ์ค‘์•™์œผ๋กœ ๋‹ค๊ฐ€๊ฐ€๋Š” ๋А๋‚Œ

ํƒ์ƒ‰ ๋ฒ”์œ„๊ฐ€ ๋งค ์žฌ๊ท€๋งˆ๋‹ค ์ ˆ๋ฐ˜์œผ๋กœ ์ค„์–ด๋“ ๋‹ค.

 

 \(O(n \log n)\) : ๋ณ‘ํ•ฉ ์ •๋ ฌ ๊ตฌ์กฐ

๋”๋ณด๊ธฐ

๋ณ‘ํ•ฉ์ •๋ ฌ(=ํ•ฉ๋ณ‘ ์ •๋ ฌ, Merge Sort)์ด๋ž€?

์ถœ์ฒ˜ : By Swfung8 - ์ž์ž‘, CC BY-SA 3.0, https://commons.wikimedia.org/w/index.php?curid=14961648

๋ถ„ํ• ์ •๋ณต(Divide and Conquer)์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ค‘ ํ•˜๋‚˜๋กœ, ๋ฐ์ดํ„ฐ๋ฅผ ์ ˆ๋ฐ˜์”ฉ ์ชผ๊ฐœ์–ด ์›์†Œ๊ฐ€ ํ•˜๋‚˜๋งŒ ๋‚จ์„๋•Œ๊นŒ์ง€ ๋‚˜๋ˆˆ ๋’ค ์ •๋ ฌ๋œ ๋ถ€๋ถ„ ๋ฆฌ์ŠคํŠธ๋“ค์„ ๋‹ค์‹œ ํ•ฉ์น˜๋ฉด์„œ ์ „์ฒด ๋ฐ์ดํ„ฐ๋ฅผ ์ •๋ ฌํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜

  • ๋ฆฌ์ŠคํŠธ์˜ ๊ธธ์ด๊ฐ€ 0 ๋˜๋Š” 1์ด๋ฉด ์ด๋ฏธ ์ •๋ ฌ๋œ ๊ฒƒ์œผ๋กœ ๋ณธ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ
  • ์ •๋ ฌ๋˜์ง€ ์•Š์€ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ ˆ๋ฐ˜์œผ๋กœ ์ž˜๋ผ ๋น„์Šทํ•œ ํฌ๊ธฐ์˜ ๋‘ ๋ถ€๋ถ„ ๋ฆฌ์ŠคํŠธ๋กœ ๋‚˜๋ˆˆ๋‹ค.
  • ๊ฐ ๋ถ€๋ถ„ ๋ฆฌ์ŠคํŠธ๋ฅผ ์žฌ๊ท€์ ์œผ๋กœ ํ•ฉ๋ณ‘ ์ •๋ ฌ์„ ์ด์šฉํ•ด ์ •๋ ฌํ•œ๋‹ค.
  • ๋‘ ๋ถ€๋ถ„ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋‹ค์‹œ ํ•˜๋‚˜์˜ ์ •๋ ฌ๋œ ๋ฆฌ์ŠคํŠธ๋กœ ํ•ฉ๋ณ‘ํ•œ๋‹ค.

๐ŸŒท ๋ฐ˜์œผ๋กœ ๊ณ„์† ๋‚˜๋ˆ„๋Š” ๊ณผ์ •์ด log n์ธ ์ด์œ 

\(log n\) = " N์ด 1์ด ๋  ๋•Œ ๊นŒ์ง€ ๋ช‡๋ฒˆ์„ ๋ฐ˜์œผ๋กœ ์ž˜๋ผ์•ผ ํ•˜๋Š”๊ฐ€? "

์˜ˆ๋ฅผ ๋“ค์–ด,

  • 16๊ฐœ๋ผ๋ฉด
    16 → 8 → 4 → 2 → 1
    ์ด 4๋ฒˆ ์ž˜๋ ธ์œผ๋‹ˆ๊นŒ logโ‚‚ 16 = 4
  • 8๊ฐœ๋ผ๋ฉด
    8 → 4 → 2 → 1
    ์ด 3๋ฒˆ → logโ‚‚ 8 = 3

๊ทธ๋Ÿฌ๋‹ˆ๊นŒ ๋ณ‘ํ•ฉ ์ •๋ ฌ์€ ๋ฐฐ์—ด์„ log n๋ฒˆ๋งŒํผ ๊นŠ๊ฒŒ ์ชผ๊ฐœ๋Š” ๊ตฌ์กฐ

 

๐ŸŒท๊ทธ๋Ÿฐ๋ฐ ์™œ n์„ ๊ณฑํ•˜๋Š”๊ฐ€?

 ๋‚˜๋ˆ„๋Š” ์ž‘์—…์€ ๋น ๋ฅด์ง€๋งŒ ํ•ฉ์น˜๋Š” ์ž‘์—…์€ ์ƒ๊ฐ๋ณด๋‹ค ๋งŽ์ด ๋“ค๊ธฐ ๋•Œ๋ฌธ

๊ฐ ์ธต์—์„œ ๋ฐฐ์—ด ์ „์ฒด๋ฅผ ๋‹ค ์Šค์บ”ํ•ด์•ผ ํ•œ๋‹ค.

๐Ÿ‘‰ ์ชผ๊ฐœ๋Š” ๊นŠ์ด๋Š” log n
๐Ÿ‘‰ ํ•˜์ง€๋งŒ “๊ฐ ์ธต๋งˆ๋‹ค” ํ•ฉ์น˜๋Š” ๋ฐ O(n) ์‹œ๊ฐ„์ด ๋“ ๋‹ค

์‹ค์ œ๋กœ ์ด๋ ‡๊ฒŒ:

  • ๋งจ ์œ„ ์ธต: 8๊ฐœ ๋ณ‘ํ•ฉ → 8๋ฒˆ ๋น„๊ต
  • ๊ทธ ์•„๋ž˜ ์ธต: 4๊ฐœ + 4๊ฐœ → ์ด 8๋ฒˆ ๋น„๊ต
  • ๊ทธ ์•„๋ž˜ ์ธต: 2+2+2+2 → ์ด 8๋ฒˆ ๋น„๊ต
  • ๊ทธ ์•„๋ž˜ ์ธต: 1+1+1+1+1+1+1+1 → ์ด 8๋ฒˆ ๋น„๊ต

์ฆ‰, ๊ฐ ์ธต์ด ์ „๋ถ€ n๋งŒํผ์˜ ์ผ์ด ํ•„์š”ํ•˜๋‹ค.

void mergeSort(int[] arr, int left, int right) {
  if (left > right) return;
  
  int mid = (left + right) / 2;
  
  // ๋ฌธ์ œ๋ฅผ ๋ฐ˜์œผ๋กœ ๋‚˜๋ˆ„๋Š” ๋ถ€๋ถ„ = 2๊ฐœ์˜ T(n/2)
  mergeSort(arr, left, mid);
  mergeSort(arr, mid + 1, right);
  
  // ๋ณ‘ํ•ฉ ๊ณผ์ •
  merge(arr, left, mid, right);
}

void merge(int[] arr, int left, int mid, int right) {

    int[] temp = new int[right - left + 1]; // ํ•ฉ์นœ ๊ฒฐ๊ณผ๋ฅผ ๋‹ด์„ ์ž„์‹œ ๋ฐฐ์—ด
    int i = left;      // ์™ผ์ชฝ ๋ฉ์–ด๋ฆฌ ์‹œ์ž‘์ 
    int j = mid + 1;   // ์˜ค๋ฅธ์ชฝ ๋ฉ์–ด๋ฆฌ ์‹œ์ž‘์ 
    int k = 0;         // ์ž„์‹œ ๋ฐฐ์—ด ์ธ๋ฑ์Šค

    // ๋‘ ๋ฉ์–ด๋ฆฌ๋ฅผ ๋น„๊ตํ•˜๋ฉฐ ์ž‘์€ ๊ฐ’๋ถ€ํ„ฐ temp์— ๋„ฃ๊ธฐ
    while (i <= mid && j <= right) {
        if (arr[i] <= arr[j]) {
            temp[k] = arr[i];
            i++;
        } else {
            temp[k] = arr[j];
            j++;
        }
        k++;
    }

    // ์™ผ์ชฝ ๋ฉ์–ด๋ฆฌ์— ๋‚จ์€ ์š”์†Œ๊ฐ€ ์žˆ์œผ๋ฉด ๊ทธ๋Œ€๋กœ ๋ณต์‚ฌ
    while (i <= mid) {
        temp[k] = arr[i];
        i++;
        k++;
    }

    // ์˜ค๋ฅธ์ชฝ ๋ฉ์–ด๋ฆฌ์— ๋‚จ์€ ์š”์†Œ๊ฐ€ ์žˆ์œผ๋ฉด ๊ทธ๋Œ€๋กœ ๋ณต์‚ฌ
    while (j <= right) {
        temp[k] = arr[j];
        j++;
        k++;
    }

    // temp ๋ฐฐ์—ด ๋‚ด์šฉ์„ ์›๋ž˜ arr๋กœ ๋Œ๋ ค๋†“๊ธฐ
    for (int t = 0; t < temp.length; t++) {
        arr[left + t] = temp[t];
    }
}

์žฌ๊ท€์‹: \(T(n)\) = \(2T(n/2)\) + \(O(n)\)  →  \(O(n \log n)\)

 

4๏ธโƒฃ ์—ฌ๋Ÿฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜(์ •๋ ฌ, ํƒ์ƒ‰ ๋“ฑ)์ด ์„ž์—ฌ ์žˆ์„ ๋•Œ (ํ•ฉ, ๊ณฑ ํŒ๋‹จ)

  • ์ˆœ์ฐจ์  ํ•ฉ :์„œ๋กœ ๋”ฐ๋กœ ์‹คํ–‰๋˜๋Š” ๋ธ”๋ก์€ ๋”ํ•œ๋‹ค
  • ์ค‘์ฒฉ(ํ•ฉ์„ฑ) ๊ณฑ : ๋‚ด๋ถ€๊ฐ€ ์™ธ๋ถ€ ํšŸ์ˆ˜์— ๋”ฐ๋ผ ๋ฐ˜๋ณต๋˜๋ฉด ๊ณฑํ•œ๋‹ค(ex. ๋‘ ์ค‘์ฒฉ for๋ฌธ)

A → B ์ˆœ์„œ๋กœ ์‹คํ–‰(๋”ํ•˜๊ธฐ → ํฐ ์ชฝ์ด ์ง€๋ฐฐ)

void mixed1 (int N) {
 for (int i = 0; i < N; i++); // O(N)
 for (int j = 0; j < N; j++); // O(N)
}
// → O(N)

 

์ค‘์ฒฉ์ด๋ฉด ๊ณฑํ•˜๊ธฐ

void mixex2 (int N, int M) {
  for (int i = 0; i < N; i++) { // O(N)
    for (int j = 0; j < M; j++) { // O(M)
      System.out.println("Hi!");
    }
  }
}
// → O(N * M)

 

์„ž์ธ ์ •๋ ฌ ๊ตฌ์กฐ \( n \log n  + N   n \log n \)

void sortAndPrint (int[] arr) {
  Arrays.sort(arr);   // O(N log N)
  for (int x : arr) { //  O(N)
    System.out.println(x);
  }
}
// ์ตœ์ข… : → O(N log N)

 

4. ์™œ ์ค‘์š”ํ•œ๊ฐ€

  1. ์„ฑ๋Šฅ ์˜ˆ์ธก : ์‹ค์ œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š๊ณ ๋„ ๋Œ€๊ทœ๋ชจ ์ž…๋ ฅ์— ๋Œ€ํ•œ ์„ฑ๋Šฅ์„ ์˜ˆ์ธกํ•˜๊ฒŒ ํ•จ
  2. ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์„ ํƒ : ๋™์ผํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ์—ฌ๋Ÿฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ค‘ ๊ฐ€์žฅ ํšจ์œจ์ ์ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์„ ํƒํ•˜๋Š” ๊ธฐ์ค€์„ ์ œ๊ณต
  3. ๋ฆฌ์†Œ์Šค ๊ด€๋ฆฌ : ์„œ๋ฒ„ ์ž์›(CPU ์‹œ๊ฐ„ ๋“ฑ) ์‚ฌ์šฉ์„ ์ตœ์ ํ™”ํ•˜์—ฌ ๋น„์šฉ์„ ์ ˆ๊ฐํ•˜๊ณ  ์„œ๋น„์Šค ์‘๋‹ต ์‹œ๊ฐ„์„ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์Œ

 

[์ฐธ๊ณ  ์ž๋ฃŒ]

https://todaycode.tistory.com/45

 

์‹œ๊ฐ„ ๋ณต์žก๋„๋ž€?

1. ์‹œ๊ฐ„ ๋ณต์žก๋„ 1-1. ์‹œ๊ฐ„ ๋ณต์žก๋„๋ž€? 1-2. Big-O ํ‘œ๊ธฐ๋ฒ• 2. ์˜ˆ์ œ 2-1. O(1) 2-2. O(n) 2-3. O(n²) 2-4. O(n³) 2-5. O(nm) 2-6. O(2โฟ) 2-7. O(logn) 3. ๊ทธ ์™ธ 3-1. ์ƒ์ˆ˜ํ•ญ ๋ฌด์‹œ 3-2. ์˜ํ–ฅ๋ ฅ์ด ๋‚ฎ์€ ํ•ญ ๋ฌด์‹œ 3-3. ๋Œ€๋žต์ ์ธ ์†Œ์š”์‹œ

todaycode.tistory.com

https://adjh54.tistory.com/186

 

[Java/์•Œ๊ณ ๋ฆฌ์ฆ˜] ์‹œ๊ฐ„ ๋ณต์žก๋„, ๊ณต๊ฐ„ ๋ณต์žก๋„, ๋น…์˜ค ํ‘œ๊ธฐ๋ฒ• ์ดํ•ดํ•˜๊ธฐ

ํ•ด๋‹น ๊ธ€์—์„œ๋Š” ํšจ์œจ์ ์ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๋Œ€ํ•œ ์„ค๊ณ„ ๋ฐ ๊ตฌํ˜„๋ฐฉ๋ฒ•๊ณผ ๊ด€๋ จ๋œ ์‹œ๊ฐ„ ๋ณต์žก๋„์™€ ๊ณต๊ฐ„ ๋ณต์žก๋„๋ฅผ ์ด์šฉํ•˜๋ฉฐ ์ด๋ฅผ ํ‘œ๊ธฐํ•˜๋Š” ๋น…์˜ค ํ‘œ๊ธฐ๋ฒ•์— ๋Œ€ํ•ด์„œ ์ดํ•ด๋ฅผ ๋•๊ธฐ ์œ„ํ•ด ์ž‘์„ฑํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค. 1) ์‹œ๊ฐ„

adjh54.tistory.com

https://gmlwjd9405.github.io/2018/05/08/algorithm-merge-sort.html

 

[์•Œ๊ณ ๋ฆฌ์ฆ˜] ํ•ฉ๋ณ‘ ์ •๋ ฌ(merge sort)์ด๋ž€ - Heee's Development Blog

Step by step goes a long way.

gmlwjd9405.github.io