forked from gyoogle/tech-interview-for-developer
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
gyusuk
committed
Jun 9, 2019
1 parent
c84b5a0
commit e9f6955
Showing
17 changed files
with
2,738 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,186 @@ | ||
#### ํ ์ํธ(Heap Sort) | ||
|
||
--- | ||
|
||
|
||
|
||
์์ ์ด์ง ํธ๋ฆฌ๋ฅผ ๊ธฐ๋ณธ์ผ๋ก ํ๋ ํ(Heap) ์๋ฃ๊ตฌ์กฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋กํ ์ ๋ ฌ ๋ฐฉ์ | ||
|
||
***์์ ์ด์ง ํธ๋ฆฌ๋?*** | ||
|
||
> ์ฝ์ ํ ๋ ์ผ์ชฝ๋ถํฐ ์ฐจ๋ก๋๋ก ์ถ๊ฐํ๋ ์ด์ง ํธ๋ฆฌ | ||
|
||
|
||
ํ ์ํธ๋ `๋ถ์์ ์ ๋ ฌ`์ ์ํจ | ||
|
||
|
||
|
||
**์๊ฐ๋ณต์ก๋** | ||
|
||
| ํ๊ท | ์ต์ | ์ต์ | | ||
| :------: | :------: | :------: | | ||
| O(nlogn) | O(nlogn) | O(nlogn) | | ||
|
||
|
||
|
||
##### ๊ณผ์ | ||
|
||
1. ์ต๋ ํ์ ๊ตฌ์ฑ | ||
2. ํ์ฌ ํ ๋ฃจํธ๋ ๊ฐ์ฅ ํฐ ๊ฐ์ด ์กด์ฌํจ. ๋ฃจํธ์ ๊ฐ์ ๋ง์ง๋ง ์์์ ๋ฐ๊พผ ํ, ํ์ ์ฌ์ด์ฆ ํ๋ ์ค์ | ||
3. ํ์ ์ฌ์ด์ฆ๊ฐ 1๋ณด๋ค ํฌ๋ฉด ์ ๊ณผ์ ๋ฐ๋ณต | ||
|
||
|
||
|
||
<img src="https://t1.daumcdn.net/cfile/tistory/999896445AD4953023"> | ||
|
||
๋ฃจํธ๋ฅผ ๋ง์ง๋ง ๋ ธ๋๋ก ๋์ฒด (11 โ 4), ๋ค์ ์ต๋ ํ ๊ตฌ์ฑ | ||
|
||
<img src="https://t1.daumcdn.net/cfile/tistory/99E1AD445AD4953015"> | ||
|
||
|
||
|
||
์ด์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์ต๋ ๊ฐ์ ํ๋์ฉ ๋ฝ์๋ด๋ฉด์ ์ ๋ ฌํ๋ ๊ฒ์ด ํ ์ํธ | ||
|
||
|
||
|
||
``` | ||
public void heapSort(int[] array) { | ||
int n = array.length; | ||
// max heap ์ด๊ธฐํ | ||
for (int i = n/2-1; i>=0; i--){ | ||
heapify(array, n, i); // 1 | ||
} | ||
// extract ์ฐ์ฐ | ||
for (int i = n-1; i>0; i--) { | ||
swap(array, 0, i); | ||
heapify(array, i, 0); // 2 | ||
} | ||
} | ||
``` | ||
|
||
|
||
|
||
##### 1๋ฒ์งธ heapify | ||
|
||
> ์ผ๋ฐ ๋ฐฐ์ด์ ํ์ผ๋ก ๊ตฌ์ฑํ๋ ์ญํ | ||
> | ||
> ์์๋ ธ๋๋ก๋ถํฐ ๋ถ๋ชจ๋ ธ๋ ๋น๊ต | ||
> | ||
> | ||
> | ||
> - *n/2-1๋ถํฐ 0๊น์ง ์ธ๋ฑ์ค๊ฐ ๋๋ ์ด์ ๋?* | ||
> | ||
> ๋ถ๋ชจ ๋ ธ๋์ ์ธ๋ฑ์ค๋ฅผ ๊ธฐ์ค์ผ๋ก ์ผ์ชฝ ์์๋ ธ๋ (i*2 + 1), ์ค๋ฅธ์ชฝ ์์ ๋ ธ๋(i*2 + 2)์ด๊ธฐ ๋๋ฌธ | ||
|
||
|
||
##### 2๋ฒ์งธ heapify | ||
|
||
> ์์๊ฐ ํ๋ ์ ๊ฑฐ๋ ์ดํ์ ๋ค์ ์ต๋ ํ์ ๊ตฌ์ฑํ๊ธฐ ์ํจ | ||
> | ||
> ๋ฃจํธ๋ฅผ ๊ธฐ์ค์ผ๋ก ์งํ(extract ์ฐ์ฐ ์ฒ๋ฆฌ๋ฅผ ์ํด) | ||
|
||
|
||
``` | ||
public void heapify(int array[], int n, int i) { | ||
int p = i; | ||
int l = i*2 + 1; | ||
int r = i*2 + 2; | ||
//์ผ์ชฝ ์์๋ ธ๋ | ||
if (l < n && array[p] < array[l]) { | ||
p = l; | ||
} | ||
//์ค๋ฅธ์ชฝ ์์๋ ธ๋ | ||
if (r < n && array[p] < array[r]) { | ||
p = r; | ||
} | ||
//๋ถ๋ชจ๋ ธ๋ < ์์๋ ธ๋ | ||
if(i != p) { | ||
swap(array, p, i); | ||
heapify(array, n, p); | ||
} | ||
} | ||
``` | ||
|
||
**๋ค์ ์ต๋ ํ์ ๊ตฌ์ฑํ ๋๊น์ง** ๋ถ๋ชจ ๋ ธ๋์ ์์ ๋ ธ๋๋ฅผ swapํ๋ฉฐ ์ฌ๊ท ์งํ | ||
|
||
|
||
|
||
ํต์ ๋ ฌ๊ณผ ํฉ๋ณ์ ๋ ฌ์ ์ฑ๋ฅ์ด ์ข๊ธฐ ๋๋ฌธ์ ํ ์ ๋ ฌ์ ์ฌ์ฉ๋น๋๊ฐ ๋์ง๋ ์์. | ||
|
||
ํ์ง๋ง ํ ์๋ฃ๊ตฌ์กฐ๊ฐ ๋ง์ด ํ์ฉ๋๊ณ ์์ผ๋ฉฐ, ์ด๋ ํจ๊ป ๋ฐ๋ผ์ค๋ ๊ฐ๋ ์ด `ํ ์ํธ` | ||
|
||
|
||
|
||
##### ํ ์ํธ๊ฐ ์ ์ฉํ ๋ | ||
|
||
- ๊ฐ์ฅ ํฌ๊ฑฐ๋ ๊ฐ์ฅ ์์ ๊ฐ์ ๊ตฌํ ๋ | ||
|
||
> ์ต์ ํ or ์ต๋ ํ์ ๋ฃจํธ ๊ฐ์ด๊ธฐ ๋๋ฌธ์ ํ๋ฒ์ ํ ๊ตฌ์ฑ์ ํตํด ๊ตฌํ๋ ๊ฒ์ด ๊ฐ๋ฅ | ||
- ์ต๋ k ๋งํผ ๋จ์ด์ง ์์๋ค์ ์ ๋ ฌํ ๋ | ||
|
||
> ์ฝ์ ์ ๋ ฌ๋ณด๋ค ๋์ฑ ๊ฐ์ ๋ ๊ฒฐ๊ณผ๋ฅผ ์ป์ด๋ผ ์ ์์ | ||
|
||
|
||
##### ์ ์ฒด ์์ค ์ฝ๋ | ||
|
||
``` | ||
private void solve() { | ||
int[] array = { 230, 10, 60, 550, 40, 220, 20 }; | ||
heapSort(array); | ||
for (int v : array) { | ||
System.out.println(v); | ||
} | ||
} | ||
public static void heapify(int array[], int n, int i) { | ||
int p = i; | ||
int l = i * 2 + 1; | ||
int r = i * 2 + 2; | ||
if (l < n && array[p] < array[l]) { | ||
p = l; | ||
} | ||
if (r < n && array[p] < array[r]) { | ||
p = r; | ||
} | ||
if (i != p) { | ||
swap(array, p, i); | ||
heapify(array, n, p); | ||
} | ||
} | ||
public static void heapSort(int[] array) { | ||
int n = array.length; | ||
// init, max heap | ||
for (int i = n / 2 - 1; i >= 0; i--) { | ||
heapify(array, n, i); | ||
} | ||
// for extract max element from heap | ||
for (int i = n - 1; i > 0; i--) { | ||
swap(array, 0, i); | ||
heapify(array, i, 0); | ||
} | ||
} | ||
public static void swap(int[] array, int a, int b) { | ||
int temp = array[a]; | ||
array[a] = array[b]; | ||
array[b] = temp; | ||
} | ||
``` | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,165 @@ | ||
#### ๋จธ์ง ์ํธ(Merge Sort) | ||
|
||
--- | ||
|
||
|
||
|
||
ํฉ๋ณ ์ ๋ ฌ์ด๋ผ๊ณ ๋ ๋ถ๋ฅด๋ฉฐ, ๋ถํ ์ ๋ณต ๋ฐฉ๋ฒ์ ํตํด ๊ตฌํ | ||
|
||
***๋ถํ ์ ๋ณต์ด๋?*** | ||
|
||
> ํฐ ๋ฌธ์ ๋ฅผ ์์ ๋ฌธ์ ๋จ์๋ก ์ชผ๊ฐ๋ฉด์ ํด๊ฒฐํด๋๊ฐ๋ ๋ฐฉ์ | ||
|
||
|
||
๋น ๋ฅธ ์ ๋ ฌ๋ก ๋ถ๋ฅ๋๋ฉฐ, ํต์ํธ์ ํจ๊ป ๋ง์ด ์ธ๊ธ๋๋ ์ ๋ ฌ ๋ฐฉ์์ด๋ค. | ||
|
||
|
||
|
||
ํต์ํธ์๋ ๋ฐ๋๋ก `์์ ์ ๋ ฌ`์ ์ํจ | ||
|
||
**์๊ฐ๋ณต์ก๋** | ||
|
||
| ํ๊ท | ์ต์ | ์ต์ | | ||
| :------: | :------: | :------: | | ||
| O(nlogn) | O(nlogn) | O(nlogn) | | ||
|
||
์์๋ฅผ ์ชผ๊ฐ ํ, ๋ค์ ํฉ๋ณ์ํค๋ฉด์ ์ ๋ ฌํด๋๊ฐ๋ ๋ฐฉ์์ผ๋ก, ์ชผ๊ฐ๋ ๋ฐฉ์์ ํต์ ๋ ฌ๊ณผ ์ ์ฌ | ||
|
||
|
||
|
||
- mergeSort | ||
|
||
``` | ||
public void mergeSort(int[] array, int left, int right) { | ||
if(left < right) { | ||
int mid = (left + right) / 2; | ||
mergeSort(array, left, mid); | ||
mergeSort(array, mid+1, right); | ||
merge(array, left, mid, right); | ||
} | ||
} | ||
``` | ||
|
||
์ ๋ ฌ ๋ก์ง์ ์์ด์ merge() ๋ฉ์๋๊ฐ ํต์ฌ | ||
|
||
|
||
|
||
*ํต์ํธ์์ ์ฐจ์ด์ * | ||
|
||
> ํต์ ๋ ฌ : ์ฐ์ ํผ๋ฒ์ ํตํด ์ ๋ ฌ(partition) โ ์์ญ์ ์ชผ๊ฐฌ(quickSort) | ||
> | ||
> ํฉ๋ณ์ ๋ ฌ : ์์ญ์ ์ชผ๊ฐค ์ ์์ ๋งํผ ์ชผ๊ฐฌ(mergeSort) โ ์ ๋ ฌ(merge) | ||
|
||
|
||
- merge() | ||
|
||
``` | ||
public static void merge(int[] array, int left, int mid, int right) { | ||
int[] L = Arrays.copyOfRange(array, left, mid + 1); | ||
int[] R = Arrays.copyOfRange(array, mid + 1, right + 1); | ||
int i = 0, j = 0, k = left; | ||
int ll = L.length, rl = R.length; | ||
while(i < ll && j < rl) { | ||
if(L[i] <= R[j]) { | ||
array[k] = L[i++]; | ||
} | ||
else { | ||
array[k] = R[j++]; | ||
} | ||
k++; | ||
} | ||
// remain | ||
while(i < ll) { | ||
array[k++] = L[i++]; | ||
} | ||
while(j < rl) { | ||
array[k++] = R[j++]; | ||
} | ||
} | ||
``` | ||
|
||
์ด๋ฏธ **ํฉ๋ณ์ ๋์์ด ๋๋ ๋ ์์ญ์ด ๊ฐ ์์ญ์ ๋ํด์ ์ ๋ ฌ์ด ๋์ด์๊ธฐ ๋๋ฌธ**์ ๋จ์ํ ๋ ๋ฐฐ์ด์ **์์ฐจ์ ์ผ๋ก ๋น๊ตํ๋ฉด์ ์ ๋ ฌํ ์๊ฐ ์๋ค.** | ||
|
||
|
||
|
||
|
||
|
||
**โ โ โ ํฉ๋ณ์ ๋ ฌ์ ์์ฐจ์ **์ธ ๋น๊ต๋ก ์ ๋ ฌ์ ์งํํ๋ฏ๋ก, **LinkedList์ ์ ๋ ฌ์ด ํ์ํ ๋ ์ฌ์ฉํ๋ฉด ํจ์จ์ **์ด๋ค.โ โ โ | ||
|
||
|
||
|
||
*LinkedList๋ฅผ ํต์ ๋ ฌ์ ์ฌ์ฉํด ์ ๋ ฌํ๋ฉด?* | ||
|
||
> ์ฑ๋ฅ์ด ์ข์ง ์์ | ||
> | ||
> ํต์ ๋ ฌ์, ์์ฐจ ์ ๊ทผ์ด ์๋ **์์ ์ ๊ทผ์ด๊ธฐ ๋๋ฌธ** | ||
|
||
|
||
**LinkedList๋ ์ฝ์ , ์ญ์ ์ฐ์ฐ์์ ์ ์ฉ**ํ์ง๋ง **์ ๊ทผ ์ฐ์ฐ์์๋ ๋นํจ์จ์ **์ | ||
|
||
๋ฐ๋ผ์ ์์๋ก ์ ๊ทผํ๋ ํต์ํธ๋ฅผ ํ์ฉํ๋ฉด ์ค๋ฒํค๋ ๋ฐ์์ด ์ฆ๊ฐํ๊ฒ ๋จ | ||
|
||
> ๋ฐฐ์ด์ ์ธ๋ฑ์ค๋ฅผ ์ด์ฉํด์ ์ ๊ทผ์ด ๊ฐ๋ฅํ์ง๋ง, LinkedList๋ Head๋ถํฐ ํ์ํด์ผ ํจ | ||
> | ||
> ๋ฐฐ์ด[O(1)] vs LinkedList[O(n)] | ||
|
||
|
||
|
||
|
||
``` | ||
private void solve() { | ||
int[] array = { 230, 10, 60, 550, 40, 220, 20 }; | ||
mergeSort(array, 0, array.length - 1); | ||
for (int v : array) { | ||
System.out.println(v); | ||
} | ||
} | ||
public static void mergeSort(int[] array, int left, int right) { | ||
if (left < right) { | ||
int mid = (left + right) / 2; | ||
mergeSort(array, left, mid); | ||
mergeSort(array, mid + 1, right); | ||
merge(array, left, mid, right); | ||
} | ||
} | ||
public static void merge(int[] array, int left, int mid, int right) { | ||
int[] L = Arrays.copyOfRange(array, left, mid + 1); | ||
int[] R = Arrays.copyOfRange(array, mid + 1, right + 1); | ||
int i = 0, j = 0, k = left; | ||
int ll = L.length, rl = R.length; | ||
while (i < ll && j < rl) { | ||
if (L[i] <= R[j]) { | ||
array[k] = L[i++]; | ||
} else { | ||
array[k] = R[j++]; | ||
} | ||
k++; | ||
} | ||
while (i < ll) { | ||
array[k++] = L[i++]; | ||
} | ||
while (j < rl) { | ||
array[k++] = R[j++]; | ||
} | ||
} | ||
``` | ||
|
Oops, something went wrong.