๋์ ๊ณํ๋ฒ์ผ๋ก ๋ฌธ์ ๋ฅผ ํ ๋๋, ์ฐ์ ์์ ๋ฌธ์ ๋ถํฐ ํด๊ฒฐํด๋๊ฐ๋ณด๋ ๊ฒ์ด ์ข๋ค. ์์ ๋ฌธ์ ๋ค์ ํ์ด๋๊ฐ๋ค๋ณด๋ฉด ์ด์ ์ ๊ตฌํด๋ ๋ ์์ ๋ฌธ์ ๋ค์ด ํ์ฉ๋๋ ๊ฒ์ ํ์ธํ๊ฒ ๋๋ค. ์ด์ ๋ํ ๊ท์น์ ์ฐพ์์ ๋ ์ ํ์์ ๋์ถํด๋ด์ด ๋์ ๊ณํ๋ฒ์ ์ ์ฉ์ํค์
๋ณต์กํ ๋ฌธ์ ๋ฅผ ๊ฐ๋จํ ์ฌ๋ฌ ๊ฐ์ ๋ฌธ์ ๋ก ๋๋์ด ํธ๋ ๋ฐฉ๋ฒ, ์์ ํ์ ๋ฌธ์ ์ ํด๋ฅผ ์ ์ฅํ๊ณ ํ์ฉํ์ฌ ์ค๋ณต ๊ณ์ฐ์ ํผํ๋ฉฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ์ค์
- ์ ๋ ฅ ํฌ๊ธฐ๊ฐ ์์ ๋ถ๋ถ ๋ฌธ์ ๋ค์ ํด๊ฒฐํ ํ, ํด๋น ๋ถ๋ถ ๋ฌธ์ ์ ํด๋ฅผ ํ์ฉํด์, ๋ณด๋ค ํฐ ํฌ๊ธฐ์ ๋ถ๋ถ ๋ฌธ์ ๋ฅผ ํด๊ฒฐ, ์ต์ข ์ ์ผ๋ก ์ ์ฒด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ์๊ณ ๋ฆฌ์ฆ
- ์ํฅ์ ์ ๊ทผ๋ฒ์ผ๋ก, ๊ฐ์ฅ ์ตํ์ ํด๋ต์ ๊ตฌํ ํ, ์ด๋ฅผ ์ ์ฅํ๊ณ , ํด๋น ๊ฒฐ๊ณผ๊ฐ์ ์ด์ฉํด์ ์์ ๋ฌธ์ ๋ฅผ ํ์ด๊ฐ๋ ๋ฐฉ์
- ํ ๊ฐ์ง ๋ฌธ์ ์ ๋ํด์, ๋จ ํ๋ฒ๋ง ํ๋๋ก ๋ง๋ค์ด์ฃผ๋ ์๊ณ ๋ฆฌ์ฆ
- ์ฆ, ๋๊ฐ์ ์ฐ์ฐ์ ๋ฐ๋ณตํ์ง ์๋๋ก ๋ง๋ค์ด์ค๋ค. ์คํ์๊ฐ์ ์ค์ด๊ธฐ ์ํด ์ฌ์ฉ๋๋ ์ํ์ ์ ๊ทผ ๋ฐฉ์์ ์๊ณ ๋ฆฌ์ฆ
Memoization
๊ธฐ๋ฒ์ ์ฌ์ฉํจ
- ์ปค๋ค๋ ๋ฌธ์ ๋ฅผ ์ฝ๊ฒ ํด๊ฒฐํ๊ธฐ ์ํด ์๊ฒ ์ชผ๊ฐ์ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ธ ๋ถํ ์ ๋ณต๊ณผ ๋งค์ฐ ์ ์ฌํ์ง๋ง ๊ฐ๋จํ ๋ฌธ์ ๋ก ๋ง๋๋ ๊ณผ์ ์์ ์ค๋ณต ์ฌ๋ถ์ ๋ํ ์ฐจ์ด์ ์ด ์กด์ฌํ๋ค.
- ์ฆ, ๋์ ๊ณํ๋ฒ์ ๊ฐ๋จํ ์์ ๋ฌธ์ ๋ค ์์์
๊ณ์ ๋ฐ๋ณต๋๋ ์ฐ์ฐ
์ ํ์ฉํ์ฌ ๋น ๋ฅด๊ฒ ํ ์ ์๋ ๊ฒ์ด ํต์ฌ
- ํผ๋ณด๋์น ์์ด
- ๋ฐฐ๋ญ ๋ฌธ์
- ์ต์ฅ ๊ณตํต ๋ถ๋ถ ์์ด
- ์ต๋จ ๊ฒฝ๋ก ๋ฌธ์
- ์ต์ ๊ฑฐ์ค๋ฆ๋ ๋ฌธ์
- ๋งคํธ๋ฆญ์ค ์ฒด์ธ ๊ณฑ์
- ํ๋ ฌ ๊ฒฝ๋ก ๋ฌธ์
-
Memoization (๋ฉ๋ชจ์ด์ ์ด์ ) ์ด๋: ํ๋ก๊ทธ๋จ ์คํ ์ ์ด์ ์ ๊ณ์ฐํ ๊ฐ์ ์ ์ฅํ์ฌ, ๋ค์ ๊ณ์ฐํ์ง ์๋๋ก ํ์ฌ ์ ์ฒด ์คํ ์๋๋ฅผ ๋น ๋ฅด๊ฒ ํ๋ ๊ธฐ์
-
๋ฌธ์ ๋ฅผ ์๊ฒ ์ชผ๊ฐค ๋, ๋ถ๋ถ ๋ฌธ์ ๋ ์ค๋ณต๋์ด, ์ฌํ์ฉ๋จ
- ์: ํผ๋ณด๋์น ์์ด 1 1 2 3 5 8 โฆ. 1 1๋ก ์์ํ๊ณ ๋ค์ ๋ชจ๋ ํญ์ ๋ฐ๋ก ์ ๋ํญ์ ํฉ์ ์์ด
ํผ๋ณด๋์น ์์ด์์ ์ฌ๊ท๋ฅผ ํ์ฉํ์ฌ ํ ๊ฒฝ์ฐ, ๊ฐ์ ์ฐ์ฐ์ ๊ณ์ ๋ฐ๋ณตํจ์ ์ ์ ์๋ค.
์ด๋,
๋ฉ๋ชจ์ด์ ์ด์
์ ํตํด ๊ฐ์ ์์ ์ ๋ํ์ด ํ์ง ์๋๋ก ๊ตฌํํ๋ฉด ํจ์จ์ ์ด๋ค.- return f(n) = f(n-1) + f(n-2)
-
์ฝ๋[์ฌ๊ท] : ์๊ฐ ๋ณต์ก๋
O(2^n)
import java.util.Scanner;
public class Fibonacci {
private static int fibonacci(int n){
if(n <= 1) return n;
return fibonacci(n - 1) + fibonacci(n - 2);
}
public static void main(String[] args){
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int result = fibonacci(n);
System.out.printf("ํผ๋ณด๋์น ์์ด์ %d๋ฒ์งธ ๊ฐ : %d", n, result);
}
}
- ์ฝ๋ 2[๋์ ๋ฐฉ๋ฒ ์ด์ฉ] : ์๊ฐ ๋ณต์ก๋
O(N)
public class Dynamic {
public int dynamicFunc(int data){
Integer[] cache = new Integer[data+1];
cache[0] = 0;
cache[1] = 1;
for(int index=2; index<data+1; index++){
cache[index] = cache[index-1] + cache[index-2];
}
return cache[data];
}
public static void main(String[] args){
Dynamic dObject = new Dynamic();
dObject.dynamicFunc(10);
}
}
๋ถํ ์ ๋ณต์ ์ฃผ๋ก ํฐ ๋ฌธ์ ๋ฅผ ์์ ํ์ ๋ฌธ์ ๋ก ๋๋์ด ํด๊ฒฐํ๋ ๋ฐ ์ค์
- ๋ฌธ์ ๋ฅผ ๋๋ ์ ์์ ๋๊น์ง ๋๋์ด์ ๊ฐ๊ฐ์ ํ๋ฉด์ ๋ค์ ํฉ๋ณํ์ฌ ๋ฌธ์ ์ ๋ต์ ์ป๋ ์๊ณ ๋ฆฌ์ฆ
- ํ์์ ์ ๊ทผ๋ฒ์ผ๋ก, ์์์ ํด๋ต์ ๊ตฌํ๊ธฐ ์ํด, ์๋๋ก ๋ด๋ ค๊ฐ๋ฉด์ ํ์์ ํด๋ต์ ๊ตฌํ๋ ๋ฐฉ์
- ์ผ๋ฐ์ ์ผ๋ก ์ฌ๊ทํจ์๋ก ๊ตฌํ
- ๋ฌธ์ ๋ฅผ ์๊ฒ ์ชผ๊ฐค ๋, ๋ถ๋ถ ๋ฌธ์ ๋ ์๋ก ์ค๋ณต๋์ง ์์
- ์: ๋ณํฉ ์ ๋ ฌ, ํต ์ ๋ ฌ ๋ฑ
๊ด๋ จ ๋์ ๋ฐฉ๋ฒ์ ๋ ธ์ ์..
- ๋ถํ ์ ๋ณต ์๊ณ ๋ฆฌ์ฆ์ ํ๋๋ก, ํฐ ๋ฌธ์ ๋ฅผ ์์ ๋ฌธ์ ๋ก ๋ถํ ํ์ฌ ํด๊ฒฐํ๋ ๋ฐฉ์์ ์ฌ์ฉํ์ฌ ์ ๋ ฌ์ ์ํํ๋ ์๊ณ ๋ฆฌ์ฆ
- ๋๋ถ๋ถ์ ๊ฒฝ์ฐ์ ๊ฑฐ์
O(n log n)
์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ฏ๋ก ๋๊ท๋ชจ ๋ฐ์ดํฐ ์ ๋ ฌ์ ๋ง์ด ์ฌ์ฉ - ํฉ๋ณ ์ ๋ ฌ์ ๋ฐ์ดํฐ ์์ด ๋ง์์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํด์ผ ํ ๋๋ ์์ ์ ์ธ ์ ๋ ฌ์ ์ํ ๋ ์ฃผ๋ก ์ ํ๋๋ ์๊ณ ๋ฆฌ์ฆ
์๋์ ๊ณผ์ ์ ๋ฐ๋ณตํ๋ฉด์ ์์ ๋ฐฐ์ด๋ถํฐ ์ ๋ ฌํ์ฌ ํฉ์ณ๋๊ฐ๋ฉด, ์ ์ฒด ๋ฐฐ์ด์ด ์ ๋ ฌ๋ ์ํ๊ฐ ๋๋ค.
ํฉ๋ณ ์ ๋ ฌ
์ ์ฌ๊ท์ ์ธ ๊ตฌ์กฐ๊ฐ ๋๋ฏ๋ก, ์๋ ์ธ ๋จ๊ณ๋ฅผ ์ฌ๊ท์ ์ผ๋ก ์ํํด ๋ด๋๊ฐ๋ฉฐ ์ ๋ ฌ์ด ์์ฑ๋๋ค.
- ๋ถํ (Divide) : ์ ๋ ฌํ ๋ฐฐ์ด์ ๋ฐ์ผ๋ก ๋๋๋ค. ์ด๋ฅผ ๊ณ์ํด์ ์์ ๋ฐฐ์ด์ด ๋ ๋๊น์ง ๋ฐ๋ณต์ ์ผ๋ก ๋ถํ
- ์ ๋ณต(Conquer) : ๋ถํ ๋ ์์ ๋ฐฐ์ด์ ์ ๋ ฌ, ๋ง์ฝ ๋ฐฐ์ด์ ๊ธธ์ด๊ฐ 1์ด๊ฑฐ๋ 0์ด๋ผ๋ฉด ์ด๋ฏธ ์ ๋ ฌ๋ ์ํ
- ํฉ๋ณ(Merge) : ์ ๋ ฌ๋ ์์ ๋ฐฐ์ด๋ค์ ํ๋๋ก ํฉ๋ณํ๋ค. ์ด๋, ๋ ๋ฐฐ์ด์ ๋น๊ตํ์ฌ ์ ๋ ฌ๋ ์์๋๋ก ํฉ์น๋๋ฐ, ์์ ๊ฐ๋ถํฐ ์์๋๋ก ๋ณํฉ
import java.util.ArrayList;
public class MergeSort {
private ArrayList<Integer> mergeFunc(ArrayList<Integer> leftArr, ArrayList<Integer> rightArr) {
ArrayList<Integer> mergedList = new ArrayList<Integer>();
int leftPoint = 0;
int rightPoint = 0;
// CASE 1 : left/right๊ฐ ๋ ๋ค ์์ ๋
while(leftArr.size() > leftPoint && rightArr.size() > rightPoint){
//์๋ฆฌ๋ฐ๊ฟ์ด ์ผ์ด๋๋ ์กฐ๊ฑด
if(leftArr.get(rightPoint) > rightArr.get(rightPoint)){
mergedList.add(rightArr.get(rightPoint));
rightPoint += 1;
}
else{
mergedList.add(leftArr.get(leftPoint));
leftPoint += 1;
}
}
// CASE 2 : right ๋ฐ์ดํฐ๊ฐ ์์ ๋
while(leftArr.size() > leftPoint){
mergedList.add(leftArr.get(leftPoint));
leftPoint += 1;
}
// CASE 3 : left ๋ฐ์ดํฐ๊ฐ ์์ ๋
while(rightArr.size() > rightPoint){
mergedList.add(rightArr.get(rightPoint));
rightPoint += 1;
}
return mergedList;
}
public ArrayList<Integer> margeSplitFunc(ArrayList<Integer> arrayList) {
if(arrayList.size() <= 1){return arrayList;}
// ์ค๊ฐ๊ฐ์ ๊ธฐ์ค์ผ๋ก ๋ณํฉํ๋ ๋๋
int medium = arrayList.size()/2;
ArrayList<Integer> leftArr = new ArrayList<Integer>();
ArrayList<Integer> rightArr = new ArrayList<Integer>();
leftArr = new ArrayList<Integer>(arrayList.subList(0, medium));
rightArr = new ArrayList<Integer>(arrayList.subList(medium, arrayList.size()));
// ์ ๋ ฌํ๋ ํจ์ ๋ง๋ค๊ธฐ
return this.mergeFunc(leftArr, rightArr);
}
public static void main(String[] args){
ArrayList<Integer> testData = new ArrayList<>();
for(int index=0; index<100; index++){
testData.add((int)(Math.random()*100));
}
System.out.println(testData);
MergeSort mergeSort = new MergeSort();
System.out.println(mergeSort.margeSplitFunc(testData));
}
}
- ์์ ์ ์ธ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ : ๋์ผํ ๊ฐ์ ์๋์ ์ธ ์์๊ฐ ๋ณํ์ง ์๋๋ค.
- ์ธ๋ถ ์ ๋ ฌ์ ์ ํฉ : ๋ฐ์ดํฐ์ ์์ด ๋ง์์ ๋ฉ๋ชจ๋ฆฌ์ ๋ชจ๋ ์ฌ๋ฆฌ๊ธฐ ์ด๋ ค์ด ๊ฒฝ์ฐ์๋ ์ฌ์ฉ ๊ฐ๋ฅ
- ์ถ๊ฐ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ํ์ : ๋ฐฐ์ด์ ๋ถํ ํ๊ณ ํฉ์น๋ ๊ณผ์ ์์ ์์ ๋ฐฐ์ด์ด ํ์ํ๋ฏ๋ก, ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ถ๊ฐ์ ์ผ๋ก ์ฌ์ฉํ๋ค.
- ํ๊ท ๋ฐ ์ต์
์๊ฐ ๋ณต์ก๋:
O(n log n)
- ์ต์ ์ ๊ฒฝ์ฐ ์๊ฐ ๋ณต์ก๋:
O(n log n)
- ์ ๋ ฌ๋ ์ํ์์๋ ํจ์จ์ : ์ด๋ฏธ ์ ๋ ฌ๋ ๋ฐฐ์ด์ ํฉ์น๋ ๊ฒฝ์ฐ์๋ ํจ์จ์ ์ผ๋ก ์๋
- ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๋ ์๊ณ ๋ฆฌ์ฆ
- ์ ๋ ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ทผ๊ฐ์ด ๋๋ ์๊ณ ๋ฆฌ์ฆ
๊ธฐ์ค ๋ฐ์ดํฐ ์ค์ , ๊ทธ ๊ธฐ์ค๋ณด๋ค ํฐ ๋ฐ์ดํฐ์ ์์ ๋ฐ์ดํฐ์ ์์น๋ฅผ ๋ฐ๊พธ๋ฉด ?
-
๊ธฐ์ค์ ์ค์ ํ ๋ค์ ํฐ ์์ ์์์๋ฅผ ๊ตํํ ํ ๋ฆฌ์คํธ๋ฅผ ๋ฐ์ผ๋ก ๋๋๋ ๋ฐฉ์
-
ํผ๋ฒ
์ด ์ฌ์ฉโ ํฐ ์ซ์์ ์์ ์ซ์ ๊ตํ์, ๊ตํํ๊ธฐ ์ํ ๊ธฐ์ค
โ ํธ ์ ๋ ฌ์ ์ํํ๊ธฐ ์ ํผ๋ฒ์ ์ด๋ป๊ฒ ์ค์ ํ ๊ฒ์ธ์ง ๋ฏธ๋ฆฌ ๋ช ์ ํด์ผ ํจ
-
ํผ๋ฒ๊ณผ ๋ฐ์ดํฐ๋ฅผ ๋น๊ตํ๋ ๋น๊ต ์ฐ์ฐ ํ์๊ฐ ์ฆ๊ฐํ๋ฏ๋ก, ์๊ฐ ๋ฉด์์๋ ์กฐ๊ธ ๋นํจ์จ์ but, ์ง๊ด์ ์ด๊ณ ๊ธฐ์ตํ๊ธฐ ์ฝ๋ค
-
์ฌ๊ท ํจ์ ๋์์๋ฆฌ๊ฐ ๊ฐ์
โ ์ข ๋ฃ์กฐ๊ฑด์ด ์์ด์ผ ํจ : ํ์ฌ ๋ฆฌ์คํธ์ ๋ฐ์ดํฐ ๊ฐ์๊ฐ 1๊ฐ์ธ ๊ฒฝ์ฐ
- ๋ฆฌ์คํธ์์ ์ฒซ ๋ฒ์งธ ๋ฐ์ดํฐ๋ฅผ ํผ๋ฒ์ผ๋ก ์ ํ๋ค
- ํผ๋ฒ ์ค์ ํ ๋ค์๋
์ผ์ชฝ
์์๋ถํฐ ํผ๋ฒ๋ณด๋ค ํฐ ๋ฐ์ดํฐ๋ฅผ ์ฐพ๊ณ ,์ค๋ฅธ์ชฝ
์์๋ถํฐ ํผ๋ฒ๋ณด๋ค ์์ ๋ฐ์ดํฐ๋ฅผ ์ฐพ์ - ํฐ ๋ฐ์ดํฐ์ ์์ ๋ฐ์ดํฐ์ ์์น๋ฅผ ์๋ก ๊ตํ
โจ 1ํํธ
- ๋ฆฌ์คํธ์ ์ฒซ ๋ฒ์งธ ๋ฐ์ดํฐ๋ฅผ ํผ๋ฒ์ผ๋ก ์ค์ ํ๋ฏ๋ก ํผ๋ฒ์ โ5โ ์ดํ์
์ผ์ชฝ
์์๋ถํฐ โ5โ๋ณด๋ค ํฐ ๋ฐ์ดํฐ๋ฅผ ์ ํํ๋ฏ๋ก โ7โ์ด ์ ํ,์ค๋ฅธ์ชฝ
์์๋ถํฐ โ5โ๋ณด๋ค ์์ ๋ฐ์ดํฐ๊ฐ ์ ํ๋๋ฏ๋ก โ4โ๊ฐ ์ ํ โ ๋ ๋ฐ์ดํฐ์ ์์น ์๋ก ๋ณ๊ฒฝ
- ๊ทธ๋ค์ ๋ค์ ํผ๋ฒ๋ณด๋ค ํฐ ๋ฐ์ดํฐ์ ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๊ฐ ์ฐพ๊ณ , ๊ทธ ๋ค ๋ ๊ฐ์ ์์น๋ฅผ ์๋ก ๋ณ๊ฒฝ
- ๊ทธ ๋ค์ ๋ค์ ํผ๋ฒ๋ณด๋ค ํฐ ๋ฐ์ดํฐ์ ์์ ๋ฐ์ดํฐ๋ฅผ ์ฐพ๋๋ค.
- ๋จ, ํ์ฌ ์ผ์ชฝ์์๋ถํฐ ์ฐพ๋ ๊ฐ๊ณผ ์ค๋ฅธ์ชฝ์์๋ถํฐ ์ฐพ๋ ๊ฐ์ ์์น๊ฐ ์๋ก ์๊ฐ๋ฆด ์๋ ์๋ค.
- ์ด๋ ๊ฒ ๋ ๊ฐ์ด ์๊ฐ๋ฆฐ ๊ฒฝ์ฐ์๋ โ์์ ๋ฐ์ดํฐโ์ โํผ๋ฒโ์ ์์น๋ฅผ ์๋ก ๋ณ๊ฒฝํ๋ค.
- ์์ ๋ฐ์ดํฐ์ โ1โ๊ณผ ํผ๋ฒ์ธ โ5โ์ ์์น๋ฅผ ์๋ก ๋ณ๊ฒฝํ์ฌ
๋ถํ ์ํ
๋ถํ ์๋ฃ
: ์ด์ ๊ฐ์ด ํผ๋ฒ์ด ์ด๋ํ ์ํ์์ ์ผ์ชฝ ๋ฆฌ์คํธ์ ์ค๋ฅธ์ชฝ ๋ฆฌ์คํธ๋ฅผ ์ดํด๋ณด์- ์ด์ โ5โ ์ผ์ชฝ์ ์๋ ๋ฐ์ดํฐ๋ ๋ชจ๋ โ5๋ณด๋ค ์๊ณ , ์ค๋ฅธ์ชฝ์ ์๋ ๋ฐ์ดํฐ๋ โ5โ๋ณด๋ค ํฌ๋ค๋ ํน์ง
๋ถํ
ํน์ํํฐ์
: ํผ๋ฒ์ ์ผ์ชฝ์๋ ํผ๋ฒ๋ณด๋ค ์์ ๋ฐ์ดํฐ๊ฐ ์์น, ํผ๋ฒ์ ์ค๋ฅธ์ชฝ์๋ ํผ๋ฒ๋ณด๋ค ์์ ๋ฐ์ดํฐ๊ฐ ์์น
โจ 2ํํธ
์ผ์ชฝ ๋ฆฌ์คํธ์์ ๋ค์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ์ ๋ ฌ ์งํ, ๊ตฌ์ฒด์ ์ธ ์ ๋ ฌ ๊ณผ์ ์ ๋์ผ
โจ 3ํํธ
์ค๋ฅธ์ชฝ ๋ฆฌ์คํธ์์ ๋ค์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ์ ๋ ฌ ์งํ, ๊ตฌ์ฒด์ ์ธ ์ ๋ ฌ ๊ณผ์ ์ ๋์ผ
-
ํ๊ท ์ ์๊ฐ๋ณต์ก๋ :
$O(NlogN)$ -
์ต์ ์ ๊ฒฝ์ฐ ์๊ฐ๋ณต์ก๋ :
$O(N^2)$ โ ๋ฐ์ดํฐ๊ฐ ์ด๋ฏธ ์ ๋ ฌ๋์ด ์๋ ๊ฒฝ์ฐ ๋งค์ฐ ๋๋ฆฌ๊ฒ ์๋
-
์์ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ๋ค์ ๋นํด ์์ฒญ ๋น ๋ฅธ ํธ
-
๋ถํ ์ด ์ด๋ฃจ์ด์ง๋ ํ์๊ฐ ๊ธฐํ๊ธ์์ ์ผ๋ก ๊ฐ์
package Danymic;
import java.util.Scanner;
public class QuickSortEx {
public static void main(String[] args){
Scanner in = new Scanner(System.in);
int arr[] = {3, 33, 38, 5, 2, 7, 15, 36, 26, 27, 2};
System.out.println("์ ๋ ฌ ์ :"+arr);
System.out.println("์ ๋ ฌ ํ");
quickSort(arr, 0, arr.length-1);
}
public static void quickSort(int[] array, int left, int right) {
if(left >= right) return;
//๋ถํ
int pivot = partition(array, left, right);
// ์๊ธฐ ์์ ์ ์ฌ๊ท์ ์ผ๋ก ๋ถ๋ฆ
quickSort(array, left, pivot);
quickSort(array, pivot+1, right);
}
private static int partition(int[] array, int left, int right) {
int pivot = array[left];
int i = left, j= right;
while (i < j){
// ํผ๋ฒ์ ๊ธฐ์ค์ผ๋ก j๋ฅผ ๊ธฐ์ค์ผ๋ก ์ฐพ์
while(pivot < array[j]){
j--;
}
while(i<j && pivot >= array[i]){
i++;
}
swap(array, i, j);
}
array[left] = array[i];
array[i] = pivot;
return i;
}
private static void swap(int[] array, int i, int j) {
int tmp = array[i];
array[i] = array[j];
array[j] = tmp;
}
}
import java.util.ArrayList;
import java.util.Arrays;
public class QuickSort {
public ArrayList<Integer> sort(ArrayList<Integer> dataList) {
if (dataList.size() <= 1) {
return dataList;
}
int pivot = dataList.get(0);
ArrayList<Integer> leftArr = new ArrayList<Integer>();
ArrayList<Integer> rightArr = new ArrayList<Integer>();
for (int index = 1; index < dataList.size(); index++) {
if (dataList.get(index) > pivot) {
rightArr.add(dataList.get(index));
} else {
leftArr.add(dataList.get(index));
}
}
ArrayList<Integer> mergedArr = new ArrayList<Integer>();
mergedArr.addAll(sort(leftArr));
mergedArr.addAll(Arrays.asList(pivot));
mergedArr.addAll(sort(rightArr));
return mergedArr;
}
public static void main(String[] args) {
ArrayList<Integer> testData = new ArrayList<Integer>();
for (int index = 0; index < 100; index++) {
testData.add((int)(Math.random() * 100));
}
QuickSort qSort = new QuickSort();
System.out.println(qSort.sort(testData));
}
}
- ํฉ๋ณ ์ ๋ ฌ
- ํต ์ ๋ ฌ
- ๊ฑฐ๋ญ์ ๊ณฑ ์๊ณ ๋ฆฌ์ฆ
- ๋ณ๋ ฌ ํ๋ ฌ ๊ณฑ์
- ์ต๊ทผ์ ์ ์ ์ฐพ๊ธฐ
- ์ต๋ ๋ถ๋ถ๋ฐฐ์ด ๋ฌธ์
- ๊ณตํต์
- ๋ฌธ์ ๋ฅผ ์๊ฒ ์ชผ๊ฐ์, ๊ฐ์ฅ ์์ ๋จ์๋ก ๋ถํ
- ์ฐจ์ด์
- ๋์ ๊ณํ๋ฒ
- ๋ถ๋ถ ๋ฌธ์ ๋ ์ค๋ณต๋์ด, ์์ ๋ฌธ์ ํด๊ฒฐ ์ ์ฌํ์ฉ๋จ
Memoization
๊ธฐ๋ฒ ์ฌ์ฉ (๋ถ๋ถ ๋ฌธ์ ์ ํด๋ต์ ์ ์ฅํด์ ์ฌํ์ฉํ๋ ์ต์ ํ ๊ธฐ๋ฒ์ผ๋ก ์ฌ์ฉ)
- ๋ถํ ์ ๋ณต
- ๋ถ๋ถ ๋ฌธ์ ๋ ์๋ก ์ค๋ณต๋์ง ์์
Memoization
๊ธฐ๋ฒ ์ฌ์ฉ ์ํจ
- ๋์ ๊ณํ๋ฒ