๐์ ์
์ ๋ ฌ : ํน์ ํ ๊ธฐ์ค์ ๋ง๊ฒ ์์๋๋ก ๋์ดํ๋ ๋ฐฉ๋ฒ
๐์ฃผ์ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ ( ๋ก์ง & ์์ ์ฝ๋ )
1. ๋ฒ๋ธ ์ ๋ ฌ
โ๏ธ ๋ก์ง
- ์ธ์ ํ ๋ ์์๋ฅผ ๋น๊ตํ์ฌ ํฌ๊ธฐ ์์๊ฐ ์๋ชป๋์ด ์์ ๊ฒฝ์ฐ, ์์น๋ฅผ ๋ฐ๊พผ๋ค
- ํ ๋ฒ์ ํจ์ค๊ฐ ๋๋๋ฉด ๊ฐ์ฅ ํฐ ๊ฐ์ด ๋ง์ง๋ง์ ์์นํ์ฌ, ๋จ์ ์์๋ค์ ๋ํด ๋ฐ๋ณตํ๋ค.
- ์๊ฐ ๋ณต์ก๋ : O(n^2)
- ๋จ์, ๋นํจ์จ์ → ์์ ๋ฐ์ดํฐ์ ์ ์ ํฉํ๋ค.
๐ ์ ํ ์ดํด ์ฝ๋
public class BubbleSort {
public static void bubbleSort(int[] arr) {
int n = arr.length;
for (int i = 0; i < n - 1; i++) {
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;
}
}
}
}
}
2. ์ ํ ์ ๋ ฌ
โ๏ธ ๋ก์ง
- ๋ฆฌ์คํธ์์ ๊ฐ์ฅ ํฐ/์์ ์์๋ฅผ ์ฐพ์ ์ฒซ ๋ฒ์งธ ์์์ ๊ตํํ๋ค.
- ์ดํ, ๊ทธ ๋ค์ ์์๋ถํฐ ๋ค์ ๋ฆฌ์คํธ์์ ๊ฐ์ฅ ํฐ/์์ ๊ฐ์ ์ฐพ์ ๋ค์ ์์์ ๊ตํํ๋ค.
- ์ ๊ณผ์ ์ ๋ฐ๋ณตํ๋ฉฐ ์ ๋ ฌ
- ์๊ฐ ๋ณต์ก๋ : O(n^2)
- ๋ฒ๋ธ ์ ๋ ฌ๋ณด๋ค ๋น๊ต ํ์๋ ์ ์ง๋ง, ํจ์จ์ฑ ↓
- ์ ์๋ฆฌ ์ ๋ ฌ์ผ๋ก, ์ถ๊ฐ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ด ์ ๋ค.
๐ ์ ํ ์ดํด ์ฝ๋
public class SelectionSort {
public static void selectionSort(int[] arr) {
int n = arr.length;
for (int i = 0; i < n - 1; i++) {
int minIndex = i;
for (int j = i + 1; j < n; j++) {
if (arr[j] < arr[minIndex]) {
minIndex = j;
}
}
// ์์น ๋ฐ๊พธ๊ธฐ
int temp = arr[i];
arr[i] = arr[minIndex];
arr[minIndex] = temp;
}
}
}
3. ์ฝ์ ์ ๋ ฌ
โ๏ธ ๋ก์ง
- ๋ฆฌ์คํธ์ ์ฒซ ๋ฒ์งธ ์์๋ ์ด๋ฏธ ์ ๋ ฌ๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผํ๊ณ ๋ ๋ฒ์งธ ์์๋ถํฐ ์ ๋ ฌ์ ์์ํ๋ค.
- ๋ ๋ฒ์งธ ์์๋ฅผ ์ ๋ ฌ๋ ๋ถ๋ถ์ ์ฝ์ ํ ์์น๋ฅผ ์ฐพ์ ๋ฐฐ์นํ๋ค
- ์ ๊ณผ์ ์ ๋ฐ๋ณตํ์ฌ ์ ๋ ฌ๋ ๋ถ๋ถ์ ํ์ฅํ๋ค.
- ์๊ฐ ๋ณต์ก๋ : O(n^2)
- ์์ ๋ฐ์ดํฐ์ , ๋๋ถ๋ถ ์ ๋ ฌ๋ ๋ฆฌ์คํธ์ ์ ํฉํ๋ค.
๐ ์ ํ ์ดํด ์ฝ๋
public class InsertionSort {
public static void insertionSort(int[] arr) {
int n = arr.length;
for (int i = 1; i < n; i++) {
int key = arr[i];
int j = i - 1;
while (j >= 0 && arr[j] > key) {
arr[j + 1] = arr[j];
j = j - 1;
}
arr[j + 1] = key;
}
}
}
4. ๋ณํฉ ์ ๋ ฌ
โ๏ธ ๋ก์ง
- ๋ฆฌ์คํธ๋ฅผ ๋ฐ์ผ๋ก ๋๋์ด ๋ ๊ฐ์ ํ์ ๋ฆฌ์คํธ๋ก ๋ถํ
- ๊ฐ ํ์ ๋ฆฌ์คํธ๋ฅผ ์ฌ๊ท์ ์ผ๋ก ๋ค์ ๋ถํ ํ ๋ค, ์ ๋ ฌํ์ฌ ๋ณํฉ
- ๋ณํฉ ๊ณผ์ ์์ ๋ ๋ฆฌ์คํธ์ ์ฒซ ์์๋ฅผ ๋น๊ตํด๊ฐ๋ฉฐ ์์ ๊ฐ๋ถํฐ ์ฐจ๋ก๋๋ก ๋ณํฉํ๋ค.
- ๋ถํ ์ ๋ณต ๊ธฐ๋ฒ์ ์ฌ์ฉํ์ฌ ๋ฆฌ์คํธ ๋ถํ
- ์๊ฐ ๋ณต์ก๋ : O(n log n)
- ์์ ์ ๋ ฌ๋ก, ๋ฐ์ดํฐ์ ํฌ๊ธฐ์ ์๊ด์์ด ์ผ์ ํ ์ฑ๋ฅ์ ๋ณด์ธ๋ค.
๐ ์ ํ ์ดํด ์ฝ๋
public class MergeSort {
// ๋ฐฐ์ด์ ๋ถํ ํ๊ณ ๋ณํฉํ๋ ๋ฉ์๋
// left : ์ผ์ชฝ ๊ฒฝ๊ณ, mid : ๋ฐฐ์ด์ ์ค๊ฐ์ , right : ์ค๋ฅธ์ชฝ ๊ฒฝ๊ณ
public static void mergeSort(int[] arr, int left, int right) {
if (left < right) {
int mid = (left + right) / 2;
// ๋ ๊ฐ์ ํ์ ๋ฆฌ์คํธ์ ๋ํด ์ฌ๊ท์ ์ผ๋ก mergeSort๋ฅผ ํธ์ถํ์ฌ ์ ๋ ฌ
mergeSort(arr, left, mid);
mergeSort(arr, mid + 1, right);
// ์ ๋ ฌ ํ, merge๋ฉ์๋๋ฅผ ์ด์ฉํ์ฌ ๋ ๋ถ๋ถ ๋ณํฉ
merge(arr, left, mid, right);
}
}
// ๋ ๊ฐ์ ์ ๋ ฌ๋ ํ์ ๋ฐฐ์ด์ ํ๋์ ์ ๋ ฌ๋ ๋ฐฐ์ด๋ก ๋ณํฉํ๋ ์์
public static void merge(int[] arr, int left, int mid, int right) {
int n1 = mid - left + 1;
int n2 = right - mid;
// ๋ ๊ฐ์ ๋ฐฐ์ด์ ๋ง๋ค์ด ์ผ์ชฝ๊ณผ ์ค๋ฅธ์ชฝ ๋ถ๋ถ ๋ฐฐ์ด ์ ์ฅ
int[] L = new int[n1];
int[] R = new int[n2];
for (int i = 0; i < n1; i++)
L[i] = arr[left + i];
for (int j = 0; j < n2; j++)
R[j] = arr[mid + 1 + j];
int i = 0, j = 0;
int k = left;
// L[i]์ R[i]๋ฅผ ๋น๊ตํ์ฌ ๋ ์์ ๊ฐ์ arr[k]์ ์ ์ฅ
while (i < n1 && j < n2) {
if (L[i] <= R[j]) {
arr[k] = L[i];
i++;
} else {
arr[k] = R[j];
j++;
}
k++;
}
// ์ด๋ ํ ์ชฝ ๋ฐฐ์ด์ด ๋ชจ๋ ์ฒ๋ฆฌ๋๋ฉด, ๋๋จธ์ง ๋ฐฐ์ด์ ๋จ์์๋ ๊ฐ๋ค์ ๊ทธ๋๋ก arr์ ๋ณต์ฌํ๋ค.
while (i < n1) {
arr[k] = L[i];
i++;
k++;
}
while (j < n2) {
arr[k] = R[j];
j++;
k++;
}
}
}
5. ํต ์ ๋ ฌ
โ๏ธ ๋ก์ง
- ๋ฆฌ์คํธ์์ ํ๋์ ํผ๋ฒ(pivot)์ ์ ํ
- ํผ๋ฒ๋ณด๋ค ์์ ๊ฐ๋ค์ ํผ๋ฒ์ ์ผ์ชฝ, ํฐ ์์๋ค์ ์ค๋ฅธ์ชฝ์ผ๋ก ์์น ์ํจ๋ค
- ์ ๊ณผ์ ์ ์ฌ๊ท์ ์ผ๋ก ๋ฐ๋ณต
- ๋ถํ ์ ๋ณต ๊ธฐ๋ฒ ์ฌ์ฉ
- ์๊ฐ ๋ณต์ก๋ : O(n^2)
- ์ต์ ์ ๊ฒฝ์ฐ ์๊ฐ ๋ณต์ก๋๋ ๋์ง๋ง, ์ด๋ฅผ ์ํ ์ฌ๋ฌ ์ต์ ํ ๊ธฐ๋ฒ์ด ์กด์ฌํ์ฌ ์๊ฐ์ ๋จ์ถ์ํฌ ์ ์๋ค.
๐ ์ ํ ์ดํด ์ฝ๋
public class QuickSort {
// ๋ฐฐ์ด์ ๋ถ๋ถ๋ค์ ์ฌ๊ท์ ์ผ๋ก ์ ๋ ฌํ๋ ๋ฉ์๋
// low : ๋ฐฐ์ด์ ์์ ์ธ๋ฑ์ค(์ผ์ชฝ ๊ฒฝ๊ณ), high : ๋ฐฐ์ด์ ๋ ์ธ๋ฑ์ค(์ค๋ฅธ์ชฝ ๊ฒฝ๊ณ)
public static void quickSort(int[] arr, int low, int high) {
// low์ high๊ฐ ๋ง๋์ง ์์ ๋์ ๋ฐฐ์ด์ ํผ๋ฒ ๊ธฐ์ค์ผ๋ก ๋ถํ
if (low < high) {
int pi = partition(arr, low, high);
// ํผ๋ฒ์ ๊ธฐ์ค์ผ๋ก ์ผ์ชฝ ๋ถ๋ถ ๋ฐฐ์ด๊ณผ ์ค๋ฅธ์ชฝ ๋ถ๋ถ ๋ฐฐ์ด์ ๋ํด ๊ฐ๊ฐ ์ฌ๊ท์ ์ผ๋ก quickSort๋ฅผ ํธ์ถํ์ฌ ์ ๋ ฌ
quickSort(arr, low, pi - 1);
quickSort(arr, pi + 1, high);
}
}
// ํผ๋ฒ์ ๊ธฐ์ค์ผ๋ก ๋ฐฐ์ด์ ๋ ๋ถ๋ถ์ผ๋ก ๋๋๊ณ , ๊ทธ ์ธ๋ฑ์ค๋ฅผ ๋ฐํํ๋ ๋ฉ์๋
public static int partition(int[] arr, int low, int high) {
int pivot = arr[high];
int i = (low - 1);
// arr[j]์ ํผ๋ฒ์ ๋น๊ตํ์ฌ arr[j]๊ฐ ํผ๋ฒ๋ณด๋ค ์์ผ๋ฉด, i๋ฅผ ์ฆ๊ฐ์ํค๊ณ arr[i]์ arr[j]๋ฅผ ๊ตํํ๋ค.
for (int j = low; j < high; j++) {
if (arr[j] < pivot) {
i++;
// Swap arr[i] and arr[j]
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
// arr[i + 1]์ ํผ๋ฒ(arr[high])์ ๊ตํํ์ฌ ํผ๋ฒ์ ์ฌ๋ฐ๋ฅธ ์์น์ ๋๋๋ค
int temp = arr[i + 1];
arr[i + 1] = arr[high];
arr[high] = temp;
return i + 1;
}
}
๐์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ ์ ํ ๊ธฐ์ค
: ๋ฌธ์ ์ ํน์ฑ์ ๋ง๋ ์ต์ ์ ๋ฐฉ๋ฒ์ ์ ํํด์ผํ๋ค.
- ๋ฐ์ดํฐ์ ํฌ๊ธฐ
- ๋ฐ์ดํฐ ๊ตฌ์กฐ ๋ฐ ์ํ : ์ ๋ ฌ ์ ๋ / ์ ๋ ฌ ๊ตฌ์กฐ ๋ฑ
- ๊ณต๊ฐ ํจ์จ์ฑ : ์ถ๊ฐ ๋ฉ๋ชจ๋ฆฌ์ ํฌ๊ธฐ
- ์์ ์ฑ : ์ค๋ณต๋ ๊ฐ์ ์์ ์ ์ง๊ฐ ์ค์ํ ๊ฒฝ์ฐ
- ์๋
'Coding Test > Data Structure & algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์๊ณ ๋ฆฌ์ฆ] ์๊ฐ ๋ณต์ก๋ (Time Complexity) (2) | 2024.09.22 |
---|---|
[์๊ณ ๋ฆฌ์ฆ] ๊ทธ๋ฆฌ๋(Greedy) (2) | 2024.09.14 |
[์๋ฃ๊ตฌ์กฐ] ํ(Queue) (1) | 2024.09.06 |
[์๋ฃ๊ตฌ์กฐ] ์คํ(Stack) (0) | 2024.09.06 |
[์๋ฃ๊ตฌ์กฐ] ์๋ฃ๊ตฌ์กฐ๋? (0) | 2024.09.06 |