๐ป
์ ์ ๊ฐ๋ฐ์ ์ธํฐ๋ทฐ ๋๋น - 2. ์๊ณ ๋ฆฌ์ฆ
April 30, 2024
์ ์ ๊ฐ๋ฐ์ ์ธํฐ๋ทฐ ๋๋น : 2. ์๊ณ ๋ฆฌ์ฆ
์๊ณ ๋ฆฌ์ฆ
- ์๊ฐ ๋ณต์ก๋ O(N^2)์ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ๊ณผ O(NlogN)์ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ ์ง๋ฌด ์ธ์ด๋ก ๋ชจ๋ ์์ด ๊ตฌํํ ์ ์๋๊ฐ?
- ๊ธฐ๋ณธ์ ์ผ๋ก ์๊ฐ ๋ณต์ก๋ N^2, NlogN์ธ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ ๊ฐ๊ฐ ๋ฒ๋ธ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ, ํต ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
- ๋ฒ๋ธ ์ ๋ ฌ์ ๊ฐ ์ํ์์ ๊ฐ์ฅ ํฐ ์์๋ฅผ ๋ฐฐ์ด ๋์ผ๋ก ์ด๋์ํค๋ ๋ฐฉ์์ผ๋ก ๋์ํ๊ณ , ์ธ์ ์์๋ฅผ ๊ณ์ ๋น๊ต ๋ฐ ์ค์ํ๋ค.
- ํต ์ ๋ ฌ์ ๋ถํ ์ ๋ณต ์ ๋ต์ ์ฌ์ฉํ์ฌ ๋ฐฐ์ด์ ์ ๋ ฌํ๋ค. ๊ธฐ์ค์ (ํผ๋ด)์ ์ ํํ๊ณ ์ด ๊ธฐ์ค์ ๋๋น ์์ ์์์ ํฐ ์์๋ฅผ ์ข์ฐ๋ก ๋ถํ ํ๊ณ ๊ฐ ๋ถ๋ถ์ ์ฌ๊ท์ ์ผ๋ก ์ ๋ ฌํ๋ค.
- ๋ฒ๋ธ ์ ๋ ฌ ๊ตฌํ
public class BubleSort { void bubleSort(int arr[]) { int n = arr.length; // ํต์ฌ์ ์ธ N^2 ์ ์๊ฐ ๋ณต์ก๋๋ ์ด์ค ๋ฃจํ์์ ๋ฐ์ํ๋ค. for (int i = 0; i < n - 1; i++) { for (int j = 0; j < n - 1; j++) { if (arr[j] > arr[j + 1]) { int temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp; } } } } void printArray(int arr[]) { for (int i = 0; i < arr.length; i++) System.out.print(arr[i] + " "); System.out.println(); } public static void main(String args[]) { BubleSort ob = new BubbleSort(); int arr[] = {64, 34, 25, 12, 22, 11, 90}; ob.bubbleSort(arr); System.out.println("Sorted array"); ob.printArray(arr); } }
- ํต ์ ๋ ฌ ๊ตฌํ
public class QuickSort { int partition(int arr[], int low, int high) { int pivot = arr[high]; int i = low - 1; for (int j = low; j < high; j++) { if (arr[j] <= pivot) { i++; int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } } int temp = arr[i+1]; arr[i + 1] = arr[high]; arr[high] = temp; return i + 1; } void sort(int arr[], int low, int high) { if (low < high) { int pi = partition(arr, low, high); sort(arr, low, pi - 1); sort(arr, pi + 1, high); } } static void printArray(int arr[]) { int n = arr.length; for (int i = 0; i < n; ++i) System.out.print(arr[i] + " "); System.out.println(); } public static void main(String args[]) { int arr[] = {10, 7, 8, 9, 1, 5}; int n = arr.length; QuickSort ob = new QuickSort(); ob.sort(arr, 0, n - 1); System.out.println("sorted array"); printArray(arr); } }
- ๊ฐ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ Best์ Worst case ์๊ฐ๋ณต์ก๋์ ๋ํด ์๊ณ , ๊ฐ ํน์ฑ์ ์ค๋ช
ํ ์ ์๋ค.
- ๋ฒ๋ธ ์ ๋ ฌ
- ํน์ฑ :
- ๋งค์ฐ ์ง๊ด์ ์ด๊ณ ๊ฐ๋จํ ์ ๋ ฌ ๋ฐฉ๋ฒ
- ์ธ์ ํ ๋ ์์ ์ฌ์ด ๊ฒ์ฌ๋ฅผ ํตํด ์ ๋ ฌ์ ์งํํ๋ฉฐ, ์ ๋ ฌ๋ ๋ฐ์ดํฐ๋ฅผ ๋ค์ ์ ๋ ฌ ์ ํจ๊ณผ์ ์ด๋ผ๋ ์ฅ์ ์ด ์๋ค.
- ๊ทธ๋ฌ๋ ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ๋ค๋ฅธ ์ ๋ ฌ์ ๋นํด ๋นํจ์จ์ ์ด๋ค.
- Best Case ์๊ฐ๋ณต์ก๋ : O(N)
- ์ด๋ฏธ ์ ๋ ฌ๋์ด ์์ ๋, ๋ฒ๋ธ ์ ๋ ฌ์ ์ต๊ณ ์ ์๋๋ฅผ ๋ธ๋ค.
- ์ด ๋๋ ๋ด๋ถ ๋ฃจํ์์ ์ค์์ด ์ผ์ด๋์ง ์์ผ๋ฏ๋ก, ๊ฐ ์์๋ ํ ๋ฒ์ฉ๋ง ํ์ธํ๋ฉด ๋๊ธฐ ๋๋ฌธ์ด๋ค.
- ์ด๋ ์ค์ํ ๊ฒ์ ๋จ์ํ ์ซ์ ๋ณํ๊ฐ ๋์ด ์๋ค! ๊ฐ ์๋๋ผ ์ ํํ๊ฒ flag๋ฅผ ํตํด ๋ณํ ์ฌ๋ถ๋ฅผ ํ์ ํ๋ ๊ธฐ๋ฏน์ ๋ฃ์์ ๋์ ํด๋นํ๋ค.
public class OptimizedBubbleSort { void bubbleSort(int arr[]) { int n = arr.length; boolean swapped; for (int i = 0; i < n - 1; i++) { swapped = false; for (int j = 0; j < n - i - 1; j++) { if (arr[j] > arr[j + 1]) { int temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; swapped = true; // swap ๋ฐ์ ์ ํ๋๊ทธ ์ค์ } } // ํ๋ฒ ํจ์ค์์ ์ค์์ด ์์๋ค๋ฉด, ๋ฐฐ์ด์ ์ด๋ฏธ ์ ๋ ฌ ๋๊ฑฐ if (!swapped) break; } } // ๋๋จธ์ง ๋ถ๋ถ์ ๊ธฐ์กด์ ๋ฒ๋ธ ์ ๋ ฌ๊ณผ ๋์ผํ๊ฒ ๊ฐ์ ธ๊ฐ๋ ๋๋ค. }
- Worst Case ์๊ฐ๋ณต์ก๋ : O(N^2)
- ๋ฐฐ์ด์ด ์ญ์์ผ๋ก ์ ๋ ฌ๋ ๊ฒฝ์ฐ ์ต์ ์ ์๊ฐ๋ณต์ก๋๋ฅผ ๋ณด์ฌ์ค๋ค.
- ๊ฐ ์์๊ฐ ๋ค์ ์์์ ๋ฌด์กฐ๊ฑด ๋น๊ต ๋ฐ ์ค์์ ํด์ผํ๊ธฐ ๋๋ฌธ์ด๋ค.
- ํน์ฑ :
- ํต์ ๋ ฌ
- ํน์ฑ
- ๋ถํ ์ ๋ณต ์ ๋ต์ ์ฌ์ฉํ๋ ๋งํผ, ๋์ ํจ์จ์ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
- ์ ๋ฐ์ ์ธ ๋ฉด์์ ๋น ๋ฅธ ์๋๋ฅผ ์ ์งํ๊ณ , ๋๊ท๋ชจ ๋ฐ์ดํฐ ์ ์์๋ ํจ๊ณผ์ ์ด๋ค.
- ํ์ง๋ง ํผ๋ฒ์ ์ ํ์ ๋ฐ๋ผ ์ฑ๋ฅ์ด ํฌ๊ฒ ๋ฌ๋ผ์ง๊ณ , ์ต์ ์ ์ผ์ด์ค๋ ์๊ธด๋ค๋ ์ ์ ์ดํดํ๊ณ ์์ด์ผ ํ๋ค.
- Best Case ์๊ฐ๋ณต์ก๋ : O(NlogN)
- ํต ์ ๋ ฌ์ ๊ฐ ๋ถํ ์ด ๊ท ๋ฑํ๊ฒ ์ด๋ฃจ์ด์ง ๊ฒฝ์ฐ์ ํจ๊ณผ์ ์ด๋ค.
- ๋งค๋ฒ ํผ๋ฒ์ด ์ค์๊ฐ ๊ทผ์ฒ๋ก ์ ํ๋์ด ์ ์ฒด ๋ฐฐ์ด์ ๊ท ๋ฑํ๊ฒ ๋ ๋ถ๋ถ์ผ๋ก ๋๋ ๋ ์ต์ ์ ์ฑ๋ฅ์ ๋ณด์ธ๋ค.
- Worst Case ์๊ฐ๋ณต์ก๋ : O(N^2)
- ํผ๋ฒ์ด ์ต์๊ฐ์ด๋ ์ต๋๊ฐ์ผ๋ก ์ ํ๋ ๋ ๋ฐ์ํ๋ค. ์ด๋ฌํ ๊ฒฝ์ฐ ๋ถํ ๊ณผ์ ์ด ํ ์ชฝ์ ์น์ฐ์ณ์ง๊ณ , ๋ชจ๋ ์์๋ฅผ ๋ฐ๊ฟ์ผ ํ๋ฏ๋ก, ์ต์ ์ ์๊ฐ๋ณต์ก๋๋ฅผ ์ผ๊ธฐํ๋ค.
- ํน์ฑ
- ์ ํ ์ ๋ ฌ
- ํน์ฑ
- ๋ฐฐ์ด ์ ์ฒด์ ๊ฐ์ฅ ์์ ์์๋ฅผ ์ฐพ์์ ๋งจ ์์ผ๋ก ์ด๋ ์ํค๊ณ , ๊ทธ ๋ค์์ผ๋ก ์์ ์์๋ฅผ ์ฐพ๋ ๋ฐฉ์์ผ๋ก ์ ๋ ฌ์ ์งํํ๋ค.
- ๋งค์ฐ ์ง๊ด์ ์ด๋ฉฐ, ์ถ๊ฐ์ ์ธ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ณต์กํ๊ฒ ํ์ํ์ง ์๋ค.
- ๊ทธ๋ฌ๋ ๋์ฉ๋ ๋ฐ์ดํฐ ์์ด ๋ง์ ์ง ์๋ก ์ฑ๋ฅ์ ๊ธ๊ฒฉํ ํ๋ฝ์ด ๋ฐ์ํ๋ค.
- Best Case ์๊ฐ๋ณต์ก๋ : O(N^2)
- ์ ๋ ฅ ๋ฐ์ดํฐ์ ์ ๋ ฌ ์ํ์ ๋ฌด๊ดํ๊ฒ ํญ์ ๋ชจ๋ ์์๋ฅผ ๊ฒ์ฌ, ์ต์ , ํ๊ท , ์ต์ ๋ชจ๋ ๋์ผํ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ค.
- Worst Case ์๊ฐ๋ณต์ก๋ : O(N^2)
- ์ ๋ ฅ ๋ฐ์ดํฐ์ ์ ๋ ฌ ์ํ์ ๋ฌด๊ดํ๊ฒ ํญ์ ๋ชจ๋ ์์๋ฅผ ๊ฒ์ฌ, ์ต์ , ํ๊ท , ์ต์ ๋ชจ๋ ๋์ผํ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ค.
- ํน์ฑ
- ์ฝ์
์ ๋ ฌ
- ํน์ฑ
- ๊ฐ ๋ฐ๋ณต์์ ํ๋์ ์ ๋ ฅ ์์๋ฅผ ์ ์ ํ ์์น์ ์ฝ์ ํ์ฌ, ๋ฐฐ์ด์ ๋ถ๋ถ์ ์ผ๋ก ์ ๋ ฌํ๋ค.
- ์์ ๋ฐ์ดํฐ์ ์ธํธ๋ ์ ๋ น์ด ์ด๋ ์ ๋ ๋ ๋ฐ์ดํฐ์ ๋ํด์ ๋น ๋ฅด๊ณ , ์์ ์ ์ด๊ฒ ์ ๋ ฌํ๋ค.
- Best Case ์๊ฐ๋ณต์ก๋ : O(N)
- ๋ฐฐ์ด์ด ์ด๋ฏธ ์ ๋ ฌ ๋์ด ์์ ๋, ์ ์ฒด ๋ฐฐ์ด์
- Worst Case ์๊ฐ๋ณต์ก๋ : O(N^2)
- ๋ฐฐ์ด์ด ์ญ์์ผ๋ก ์ ๋ ฌ๋์ด ์์ด์, ๊ฐ ์์๋ฅผ ๋ฐฐ์ด์ ์ฒ์๋ถํฐ ๊ทธ ์์น๊น์ง ์ด๋์์ผ์ผ ํ์ฌ์ ์ต์ ์ ์ผ์ด์ค์ด๋ค.
- ํน์ฑ
- ๋ณํฉ ์ ๋ ฌ
- ํน์ฑ
- ๋ถํ ์ ๋ณต์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ์ฌ ๋ฐฐ์ด์ ์ ๋ฐ์ผ๋ก ๋๋๊ณ , ๊ฐ ๋ถ๋ถ์ ์ฌ๊ท์ ์ผ๋ก ์ ๋ ฌํ๊ณ ๋ค์ ๋ณํฉํ๋ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๋ค.
- ๋๊ท๋ชจ ๋ฐ์ดํฐ ์ ์ ํจ๊ณผ์ ์ด๋ฉฐ, ์์ ์ ์ด๋ค.
- ๊ทธ๋ฌ๋ ์ด๋ฌํ ๊ตฌ์กฐ๊ฐ ์ถ๊ฐ์ ์ธ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ์๋ก ํ๋ค.
- Best Case ์๊ฐ๋ณต์ก๋ : O(NlogN)
- ๋ฐฐ์ด์ ๋ถํ ํ๊ณ ๊ฐ ๋ถ๋ถ์ ๋ถํ ๋ฐ ๋ณํฉํ๋๋ฐ ํ์ํ ๋ก๊ทธ ์ค์ผ์ผ์ ๋จ๊ณ๋ฅผ ๊ฑฐ์น๋ค๋ณด๋ ์ผ์ ํ ์๊ฐ๋ณต์ก๋๋ฅผ ์ํ๋ค .
- Worst Case ์๊ฐ๋ณต์ก๋ : O(NlogN)
- ๋ณํฉ ์ ๋ ฌ์ ๋ฐฐ์ด ์ด๊ธฐ ์ํ์ ๋ฌด๊ดํ๊ฒ, Best์ ๋์ผํ๊ฒ ๋ถํ ๋ฐ ๋ณํฉ ๊ณผ์ ์์ ํ์ํ ์๊ฐ์ผ๋ก ๋ก๊ทธ ์ค์ผ์ผ์ด ํ์๋ก ํ๋ค.
- ํน์ฑ
- ํ ์ ๋ ฌ
- ํน์ฑ
- ํ ์ ๋ ฌ์ ์ด์ง ํ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ์ฌ ์ ๋ ฌ์ ์ํํ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
- ๋ฐฐ์ด ๋ด์ ๋ชจ๋ ์์๋ฅผ ํ์ผ๋ก ๊ตฌ์ฑ, ๊ฐ์ฅ ํฐ ์์๋ฅผ ์ ๊ฑฐํ๊ณ , ๋๋จธ์ง ์์๋ก ํ์ ๋ค์ ๊ตฌ์ฑํ๋ ๊ณผ์ ์ ๋ฐ๋ณตํ๋ค.
- ์ด๋ ์ถ๊ฐ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ด ๊ฑฐ์ ์๊ณ , ์ต์ ์๋ ์๊ฐ๋ณต์ก๋ ๋ก๊ทธ ์ค์ผ์ผ์ ์ ์งํ๋ค.
- Best Case ์๊ฐ๋ณต์ก๋ : O(NlogN)
- Worst Case ์๊ฐ๋ณต์ก๋ : O(NlogN)
- ํน์ฑ
- ์นด์ดํ
์ ๋ ฌ
- ํน์ฑ
- ์ ๋ ฌํ ์์์ ๋ฒ์๊ฐ ์ ํ์ ์ผ๋ ์ฌ์ฉํ๋ ๋น๊ต ๊ธฐ๋ฐ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ด ์๋ ๋ฐฉ์์ด๋ค.
- ๊ฐ ์ซ์์ ์ถํ ํ์๋ฅผ ๊ณ์ฐํ๊ณ , ์ด๋ฅผ ๋ฐํ์ผ๋ก ๊ฐ ์ซ์์ ์์น๋ฅผ ๋ฐฐ์ด์ ์ง์ ๋ฐฐ์นํ๋ค.
- ์ ์๋ ์ผ์ ๋ฒ์์ ์์ ์ซ์๋ฅผ ์ ๋ ฌํ ๋ ๋งค์ฐ ๋น ๋ฅด๊ณ ํจ๊ณผ์ ์ด๋ค.
- Best Case ์๊ฐ๋ณต์ก๋ : O(n + k) k๋ ์ซ์ ๋ฒ์๋ค.
- Worst Case ์๊ฐ๋ณต์ก๋ : O(n + k)
- ํน์ฑ
- ๊ธฐ์ ์ ๋ ฌ
- ํน์ฑ
- ๊ฐ ์๋ฆฌ์๋ฅผ ๊ฐ๋ณ์ ์ผ๋ก ์ ๋ ฌํ๋ ๋ฐฉ์์ผ๋ก, ๋ณดํต ์ตํ์ ์๋ฆฟ์๋ถํฐ ์์ํ์ฌ ์ต์์ ์๋ฆฌ์๊น์ง ์ฐจ๋ก๋ก ์ ๋ ฌํ๋ค.
- ์นด์ดํ ์ ๋ ฌ๊ณผ ๊ฐ์ ์์ ์ ์ธ ์ ๋ ฌ์ ์ฌ์ฉํ์ฌ ๊ฐ ์๋ฆฟ์๋ฅผ ์ ๋ ฌํ๋ค.
- ๊ธฐ์ ์ ๋ ฌ์ ์ซ์ ๋ฒ์๊ฐ ํด ๋ ์นด์ดํ ์ ๋ ฌ ๋ณด๋จ ํจ์จ์ ์ด๋ค.
- Best Case ์๊ฐ๋ณต์ก๋ : O(n * k)
- Worst Case ์๊ฐ๋ณต์ก๋ : O(n * k)
- ํน์ฑ
- ๋ฒํท ์ ๋ ฌ
- ํน์ฑ
- ์ฌ๋ฌ ๋ฒํท(๋๋ ๋ฒ๋ธ)์ ๋ถ๋ฐฐํ๊ณ , ๊ฐ ๋ฒํท์ ๊ฐ๋ณ์ ์ผ๋ก ์ ๋ ฌํ ํ, ๊ฒฐ๊ณผ๋ฅผ ํ๋๋ก ๋ณํฉํ๋ ๋ฐฉ์์ด๋ค.
- ๋ฐ์ดํฐ๊ฐ ๊ท ๋ฑํ๊ฒ ๋ถํฌ๋ ๊ฒฝ์ฐ ๊ฐ์ฅ ์ ์๋ํ๊ณ , ๋ถ๋์์์ ์๋ฅผ ์ ๋ ฌํ ๋ ์ ์ฉํ๋ค.
- Best Case ์๊ฐ๋ณต์ก๋ : O(N + K)
- Worst Case ์๊ฐ๋ณต์ก๋ : O(N^2)
- ๋ฒํท ๋ด์ ์์๊ฐ ๊ท ๋ฑํ๊ฒ ๋ถ๋ฐฐ๋์ง ์์ ๊ฒฝ์ฐ
- ํน์ฑ
- LIS ์๊ณ ๋ฆฌ์ฆ(Longest Increasing Subsequence)
- ํน์ฑ
- ์ต์ฅ ์ฆ๊ฐ ๋ถ๋ถ ์์ด์ ๋ฐ๊ฒฌํ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค
- ์ด ์์ด์ ์ฐ์์ ์ผ ํ์๋ ์์ผ๋ฉฐ, ์์๋ง ์ ์งํ๋ฉด ๋๋ค.
- ๋์ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์ : ๊ฐ ์์๋ฅผ ๋์ผ๋ก ํ๋ ์ต์ฅ ์ฆ๊ฐ ๋ถ๋ถ ์์ด์ ๊ธธ์ด๋ฅผ ์ฐพ๋ ๋ฐฉ์
- ์ด์ง ๊ฒ์ ๋ฐฉ์ : ๊ฐ ์์๋ฅผ ์ ์ ํ ์์น์ ์ฝ์ ํ์ฌ ๊ฐ์ฅ ๊ธด ์ฆ๊ฐ ๋ถ๋ถ ์์ด์ ๋์ ์ผ๋ก ๊ตฌ์ฑํ๋ค.
- LIS ์์ฒด๋ ๋ถ๋ถ์ ๊ตฌํ๋ ๊ณต์์ด๋ฏ๋ก, ๋ค๋ฅธ ์๊ณ ๋ฆฌ์ฆ๊ณผ ํจ๊ณผ์ ์ผ๋ก ์กฐํฉํ๋ฉด ๋ฐฐ์ด์ ์ํ ์๊ณ ๋ฆฌ์ฆ ๋ฑ์ผ๋ก ํ์ฉ์ด ๊ฐ๋ฅํ๋ค.
- ๋์ ํ๋ก๊ทธ๋๋ฐ
- Best Case : O(N^2)
- Worst Case : O(N^2)
- ์ด์ง ๊ฒ์
- Best Case : O(NlogN)
- Worst Case : O(NlogN)
- ํน์ฑ
- ๋ฒ๋ธ ์ ๋ ฌ
- ์ฌ๊ท์ ๋ํด ์ค๋ช
ํ ์ ์๋ค.
- ์ฐ๋ฆฌ๊ฐ ์๋ ๊ทธ ์ฌ๊ท, ์ผ๊ด๋ก ๋ฆฌํด๊ฐ์ ๋ฐ๋ ๊ทธ ์ฌ๊ท๋ฅผ ์ข๋ ๋ฉ์ง๊ฒ ํํํ๋ฉด ์ด๋ป๊ฒ ํํํ๋ฉด ์ข์๊ฐ?
- ์ฌ๊ท๋ ์ํ์์๋ถํฐ ๋น๋ ค์จ ๊ฐ๋ ์ผ๋ก ๋ฐ๋ณต๋๋ ์ฝ๋๋ฅผ ์์ฑํ๊ธฐ ๋ณด๋ค ํจ์๋ฅผ ํธ์ถํ๋ ๋ฐฉ์์ผ๋ก ๋ฃจํ๋ฅผ ๋๊ณ , ๋ชฉ์ ์ด๋ ์กฐ๊ฑด์ ๊ท๊ฒฐ๋๋ ์ํฉ์ด ๋์์ ๋ ์์ ์ ๋ฆฌํดํ๊ณ ๊ฐ์ ๋ฐํํ๋ ๋ฐฉ์์ด๋ค.
- ์ฌ๊ท๋ ํธ์ถ ๋ ๋๋ง๋ค ์คํํ๋ ์ ๊ตฌ์กฐ๊ฐ ํธ์ถ๋์ด, ํจ์ ์์ ์ ๋ณต์ฌ๋ณธ์ด ๋ฉ๋ชจ๋ฆฌ์ ์ฐ๊ฑฐํธ ๊ตฌํ๋๋ค.
- ๋ฐ๋ณต์ ๋นํด ์ฝ๋๊ฐ ๋จ์ํด์ง ์ ์์ผ๋ฉฐ, ๋ฌดํ ๋ฃจํ ๋ฐ์ ์ ์ฌ๊ท์ ๊ฒฝ์ฐ ์คํ ์ค๋ฒํ๋ก์ฐ๋ฅผ ์ด๋ํ์ฌ, ์ผ์ ๋ฉด์์ ์ข ๋ฃ ๋๋ค๋ ์ด์ ์ด ์๋ค. ๋ฐ๋ณต์ ์ด์ ๋นํด ๋ฉ๋ชจ๋ฆฌ์์ ํจ์จ์ ์ด๋ค๋ณด๋ ๋ฌดํํ๊ฒ ๋ฐ๋ณต์ ๋ค์ด๊ฐ๊ฒ ๋๋ ๊ฒฝ์ฐ, ์ธ์งํ๊ธฐ ์ ๊น์ง ๋ชจ๋ฅด๋ฉฐ, ์์คํ ์ ๊ฐ์ ์ข ๋ฃ ์ํค์ง ์์ผ๋ฉด์๋๋ค. ์ด๋ฌํ ์ ๋๋ฌธ์ ๋ฐ๋ณต๊ณผ ์ฌ๊ท๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ ํน์ฑ์ ๊ณ ๋ คํ์ฌ ์ ์ ํ๊ฒ ์ฌ์ฉํ๋๊ฒ ์ค์ํ๋ค.
- BFS/ DFS์ ๋ํด ์ค๋ช
ํ ์ ์๋ค. ์ง๋ฌด ์ธ์ด๋ก ํด๋น ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌํํ ์ ์๋ค.
- BFS(Breadth-First Search) :
- ํน์ฑ BFS๋ ๊ฐ์ฅ ๊ฐ๊น์ด ๋ ธ๋๋ถํฐ ์์ํ์ฌ ์ ์ฐจ ๋ฉ๋ฆฌ ์๋ ๋ ธ๋๋ฅผ ํ์ํ๋ฉฐ, ์ฃผ๋ณ๋ถ๋ฅผ ์๋ฒฝํ๊ฒ ํ์ธ, ์ดํ ๋ค์ ๊น์ด๋ก ๋์ด๊ฐ๋ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๋ค.
- ํ๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌํํ๊ณ , ๊ฐ ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธ ์ ์ธ์ ํ ๋ ธ๋๋ฅผ ํ์ ์ถ๊ฐํ๋ค.
- BFS ๋ ์ต๋จ๊ฒฝ๋ก๋ฅผ ์ฐพ๋ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉ๋๋ฉฐ ๋ ๋ฐธ๋ณ๋ก ํ์์ด ๋๋ฏ๋ก, ๊ณ์ธต์ ๊ทธ๋ํ ํ์์ ์ ํฉํ๋ค.
- ๊ตฌํ ์์
import java.util.*; public class BFS { private int V; private LinkedList<Integer> adj[]; public BFS(int v) { this.V = v; adj = new LinkedList[v]; for (int i = 0; i < this.V; ++i) { adj[i] = new LinkedList(); } } void addEdge(int v, int w) { adj[v].add(w); // ๋ ธ๋ v์ ์ธ์ ํ ๋ ธ๋ w ์ถ๊ฐ } void BFS(int s) { boolean visited[] = new boolean[this.V]; LinkedList<Integer> queue = new LinkedList<Integer>(); visited[s] = true; queue.add(s); while(queue.size() != 0) { s = queue.poll(); // ์์ ํ๋ ์ ๊ฑฐํ๊ณ ๋ฐํ System.out.print(s + " "); Iterator<Integer> i = adj[s].listIterator(); while (i.hasNext()) { int n = i.next(); if (!visited[n]) { visited[n] = true; queue.add(n) } } } } public static void main(String args[]) { BFS g = new BFS(4); g.addEdge(0, 1); g.addEdge(0, 2); g.addEdge(1, 2); g.addEdge(2, 0); g.addEdge(2, 3); g.addEdge(3, 3); System.out.println("Breadth First Traversal (starting from vertex 2)"); g.BFS(2); } }
- DFS(Depth-First Search)
- ์ฐ์ ์ ์ผ๋ก ๋ ธ๋์ ๊น์ด๋ก ๋ค์ด๊ฐ์ ํ์ํ๋ ๊ตฌ์กฐ๋ก ํ์ํ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค. ์คํ์ ์ฌ์ฉํ๊ฑฐ๋ ์ฌ๊ท ํธ์ถ ๋ฑ์ผ๋ก ๊ตฌํ์ด ๊ฐ๋ฅํ๋ค.
- ์ฌ์ดํด ๊ฐ์ง, ๊ฒฝ๋ก ํ์, ๊ทธ๋ํ์ ํ์ ์ํ ๋ฑ์ ์ ์ฉํ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
- ๊ตฌํ
import java.util.*; public class DFS { private int V; // ๋ ธ๋์ ๊ฐ์ private LinkedList<Integer> adj[]; // ์ธ์ ๋ฆฌ์คํธ DFS(int v) { V = v; adj = new LinkedList[v]; for (int i=0; i<v; ++i) adj[i] = new LinkedList(); } void addEdge(int v, int w) { adj[v].add(w); // v์ ์ธ์ ํ ๋ ธ๋ w ์ถ๊ฐ } void DFSUtil(int v, boolean visited[]) { visited[v] = true; System.out.print(v + " "); Iterator<Integer> i = adj[v].listIterator(); while (i.hasNext()) { int n = i.next(); if (!visited[n]) DFSUtil(n, visited); } } void DFS(int v) { boolean visited[] = new boolean[V]; DFSUtil(v, visited); } public static void main(String args[]) { DFS g = new DFS(4); g.addEdge(0, 1); g.addEdge(0, 2); g.addEdge(1, 2); g.addEdge(2, 0); g.addEdge(2, 3); g.addEdge(3, 3); System.out.println("Depth First Traversal (starting from vertex 2)"); g.DFS(2); } }
- BFS(Breadth-First Search) :
- ๋ค์ต์คํธ๋ผ, ํ๋ฆผ, ํ๋ก์ด๋-์์
, ๋ฒจ๋งํฌ๋, ํฌ๋ฃจ์ค์นผ ์๊ณ ๋ฆฌ์ฆ ๋ฑ ๊ทธ๋ํ์์ ์ฌ์ฉํ๋ ์๊ณ ๋ฆฌ์ฆ์ ๋ํด ์๊ณ ์๋๊ฐ?
- ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ
- ๋ชฉ์ : ํ๋์ ์ ์ ์์ ๋ค๋ฅธ ๋ชจ๋ ์ ์ ๊น์ง์ ์ต๋จ ๊ฒฝ๋ก ํ์
- ํน์ฑ : ๊ฐ์ค์น๊ฐ ์๋ ๊ทธ๋ํ์์ ์ฌ์ฉ๋๋ฉฐ, ์์ ๊ฐ์ค์น๋ฅด ๊ฐ์ง ๊ฐ์ ์ด ์์ ๊ฒฝ์ฐ ์ฌ์ฉํ ์ ์๋ค.
- ๋ฐฉ๋ฒ : ํ์ฌ ์ ์ ์์ ๊ฐ์ฅ ๊ฐ๊น์ด ์ ์ ์ ์ฐ์ ์ ์ผ๋ก ์ ํํ๊ณ ํด๋น ์ ์ ์์ ๋ค๋ฅธ ์ ์ ์ผ๋ก์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐฑ์ ํ๋ค.
- ํ๋ฆผ ์๊ณ ๋ฆฌ์ฆ
- ๋ชฉ์ : ์ฃผ์ด์ง ๊ทธ๋ํ์ ์ต์ ์คํจ๋ ํธ๋ฆฌ(Minimum Spanning Tree)๋ฅผ ์ฐพ๋๋ค.
- ํน์ฑ : ๊ฐ์ค์น๊ฐ ์๋ ์ฐ๊ฒฐ ๊ทธ๋ํ์์ ์ฌ์ฉ๋๋ฉฐ, ํฌ๋ฃจ์ค์นผ ์๊ณ ๋ฆฌ์ฆ๊ณผ ์ ์ฌํ๋ค.
- ๋ฐฉ๋ฒ : ํน์ ์ ์ ์์ ์์ํ์ฌ ์ ํ๋ ์ ์ ์งํฉ์ ์ธ์ ํ ์ ์ ์ค ์ต ๊ฐ์ค์น์ ๊ฐ์ ์ ์ ํํ์ฌ ํธ๋ฆฌ๋ฅผ ํ์ฅํ๋ค.
- ํฌ๋ฃจ์ค์นผ ์๊ณ ๋ฆฌ์ฆ(Kruskalโs Algorithm)
- ๋ชฉ์ : ์ฃผ์ด์ง ๊ทธ๋ํ์ MST ๋ฅผ ์ฐพ๋๋ค.
- ํน์ฑ : ๊ฐ์ค์น๊ฐ ์๋ ๊ทธ๋ํ์์ ๊ฐ์ญ์ ๊ฐ์ค์น ์์ผ๋ก ์ ๋ ฌํ ๋ค, ์์ฐจ์ ์ผ๋ก ์ ํํ์ฌ ์คํจ๋ ํธ๋ฆฌ๋ฅผ ๊ตฌ์ฑํ๋ค.
- ๋ฐฉ๋ฒ : ์ ๋์จ ํ์ธ๋(Union-Find) ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ๊ณ , ์ฌ์ดํด์ด ํ์ฑ๋์ง ์๋ ์ ์์ ๊ฐ์ ์ ์ถ๊ฐํ๋ค.
- ํ๋ฃจ์ด๋-์์
์๊ณ ๋ฆฌ์ฆ(Floyd-Warshall)
- ๋ชฉ์ : ๋ชจ๋ ์์ ์ ์ ๊ฐ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ์ฐพ๋๋ค.
- ํน์ฑ : ๊ฐ์ค์น ์๋ ๊ทธ๋ํ์์ ์์ ๊ฐ์ค์น๊ฐ ์์ด๋ ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
- ๋ฐฉ๋ฒ : ๋์ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ผ๋ก ๊ฐ ์ ์ ์ ๊ฐ์ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ์ ์ง์ ์ผ๋ก ๊ฐฑ์ ํ๋ค.
- ๋ฒจ๋ง-ํฌ๋ ์๊ณ ๋ฆฌ์ฆ(Bellman-Ford)
- ๋ชฉ์ : ํ๋์ ์ ์ ์์ ๋ค๋ฅธ ๋ชจ๋ ์ ์ ๊น์ง์ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ์ฐพ์ผ๋ฉฐ, ์์ ๊ฐ์ค์น๊ฐ ์๋ ๊ฒฝ์ฐ์๋ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
- ํน์ฑ : ์์ ๊ฐ์ค์น๊ฐ ์๋ ๊ฒฝ๋ก๋ฅผ ํฌํจํ์ฌ ์์ ์ํ์ ๊ฐ์งํ ์ ์๋ค.
- ๋ฐฉ๋ฒ : ๋ฐ๋ณต์ ์ผ๋ก ๋ชจ๋ ๊ฐ์ ์ ๊ฒ์ฌํ๊ณ , ์ต๋จ ๊ฒฝ๋ก๋ฅผ ์ฐพ๊ณ , ์์ ์ํ ์กด์ฌ ์ ๋ฌด๋ฅผ ํ์ธํ๋ค.
- ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ
- ์ฝ๋๋ฅผ ๋ณด๊ณ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ณ์ฐํ ์ ์๋ค.
- ์ฝ๋์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ณ์ฐํ๋ ๊ฒ์ ์๊ณ ๋ฆฌ์ฆ์ ์ฑ๋ฅ์ ๋ํ ์ดํด, ํน์ ์ ๋ ฅ ํฌ๊ธฐ์ ๋ํด ์ผ๋ง๋ ๋นจ๋ฆฌ ์คํ๋๋์ง ์์ธกํ๋ ๋ฐ ์ค์ํ ์ญํ ์ ํ๋ค.
- ์ฝ๋์ ๊ธฐ๋ณธ ์ฐ์ฐ ์ดํดํ๊ธฐ ์ฝ๋์์ ๊ฐ์ฅ ๋ง์ด ์ผ์ด๋ ์์ญ์ ํ์ ํ๋ค. ๋ฐ๋ณต๋ฌธ, ์ฌ๊ท ํธ์ถ, ์กฐ๊ฑด๋ฌธ ๋ฑ ์ด๋ฌํ ๋ถ๋ถ์์ ์คํ์๊ฐ์ด ๊ฐ์ฅ ํฐ ์ํฅ์ ์ค๋ค.
- ๋ฐ๋ณต๋ฌธ ๋ฌธ์ ๋ฐ๋ณต๋ฌธ์ด ์ผ๋ง๋ ์์ฃผ ์ผ์ด๋๋ฉฐ, ๊ทธ ๋์์ ๋ฒ์๊ฐ ์ด๋์ ๋ ๋ ์ง๋ฅผ ๋ณด๋ฉด ๋๋ค. ๋ณต์ก๋๋ ๋ฐฐ์ด ํฌ๊ธฐ์ ๋น๋กํ์ฌ ํด๋น ๋ถ๋ถ์์ O(N)์ด ๋๋ค.
- ์ค์ฒฉ ๋ฐ๋ณต๋ฌธ ํ์ธ ์ธ๋ถ, ๋ด๋ถ์ ๋ฐ๋ณต์ ๊ฐ๊ฐ์ ์คํํ์๋ฅผ ๊ณฑํ ๋งํผ ๊ธฐ๋ณธ ์ฐ์ฐ์ด ์ํ๋๋ฏ๋ก O(NM)์ ๋ณต์ก๋๋ฅผ ๋ณด์ฌ์ค๋ค. ๋ฐ๋ผ์ ๋ด์ธ๋ถ๊ฐ ๋์ผํ ๊ฒฝ์ฐ ์ ๊ณฑ์ด ๋๊ณ , ์ค์ฒฉ์ด ๋ช๋ฒ ๋๋์ ๋ฐ๋ผ ๋ ์๊ฐ๋ณต์ก๋๊ฐ ์ฌ๋ผ๊ฐ ์ ์๋ค.
- ์ฌ๊ท ํจ์ ๋ถ์ ๊ฐ ํธ์ถ์์ ์ฌ๊ท๊ฐ ํธ์ถ๋๋ ์์ค์ ์ฒดํฌํด์ผ ํ๋ฉฐ ๋ณดํต O(NlogN) ๋ด์ง๋ O(logN) ์ ๋์ ๋ณต์ก๋๋ฅผ ์ถ์ฐํ ์ ์๋ค.
- Worst, Average, Best ์ผ์ด์ค ๊ณ ๋ ค ์๊ณ ๋ฆฌ์ฆ์ ํญ์ ์ต์ -ํ๊ท -์ต๋ ๊ฒฝ์ฐ๋ฅผ ๊ณ ๋ คํ์ฌ ์๊ฐ๋ณต์ก๋๋ฅผ ํ๋จํด์ผ ํ๋ค. ๋จ ์ด๋, ์ฑ๋ฅ์ ์ธ ์งํ๋ ์ต์ ๋ด์ง๋ ํ๊ท ๋ณด๋จ ์ต์ ์ ๊ธฐ์ค์ผ๋ก ๊ณ ๋ คํ๋ฉด ๋๋ค.
- ์ต๋ ์ฐจ์๋ฅผ ํ์ธํ๋ผ
์ ์ฒด ์ฝ๋์ ์์ ํตํด ์๊ฐ ๋ณต์ก๋๋ฅผ ์์ํ ์ ์๊ฒ ๋๋๋ฐ, ์ด๋ ์ผ์ข
์ ๋ฐฉ์ ์ ํํ๊ฐ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ฑฐ๊ธฐ์ ๋์ฉ๋ ์ฒ๋ฆฌ์ ๊ฐ๊น์ด ์
๋ ฅ์ ๋ฐ๊ณ , ๋ฐ๋ณต๋ฌธ์ด ๋์๊ฐ๋ค๊ณ ํ๋ฉด ์ค์ง์ ์ผ๋ก ๊ฐ์ฅ ๋์ ์ฐจ์์ ๋ณ์์ ์๊ฐ๋ณต์ก๋์ ๊ฐ๊น๊ณ , ๊ทธ ํ์ ๋ณ๋ค์ ์ค์ง์ ์ผ๋ก ์๋ฏธ๊ฐ ์์ด์ง๋ค(๊ฐ์ ํฌ๊ธฐ ํญ์ด ์ปค์).
O(N^3 + 4N + 15) ๋ผ๋ ์๊ฐ๋ณต์ก๋๊ฐ ์๋ค๊ณ ํ ๋, ์ค์ง์ ์ผ๋ก ์๊ฐ ๋ณต์ก๋๋ O(N^3) ์ด๋ค. ์๋ํ๋ฉด N์ด 100์ ๊ธฐ์ค์ผ๋ก ์ผ๋๋ผ๋ ์๊ฐ ๋ณต์ก๋๋ O(1000000 + 400 + 15) ๋ก ์ค์ง์ ์ผ๋ก O(1000000)์ ํฐ ์ฐจ์ด๊ฐ ์๋ ๊ฒ์ด๋ค.