๋ฐ์ํ
์๋ฃ๊ตฌ์กฐ,์๊ณ ๋ฆฌ์ฆ ์ฉ์ด/๊ฐ๋ ์ ๋ฆฌ
์๋ฃ๊ตฌ์กฐ
- ์ฝ๋์์์ ๋ฐ์ดํฐ๋ฅผ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ๊ธฐ ์ํด ๋ฐ์ดํฐ๋ฅผ ๊ตฌ์กฐํ ํ ๊ฒ
์๊ณ ๋ฆฌ์ฆ
- ์ด๋ค ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ์ ์ฐจ ๋๋ ๋ฐฉ๋ฒ
๋ฐฐ์ด(Array)
- ๋ฐ์ดํฐ๋ฅผ ๋์ดํ๊ณ , ๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ธ๋ฑ์ค์ ๋์ํ๋๋ก ๊ตฌ์ฑํ ๋ฐ์ดํฐ ๊ตฌ์กฐ
ํ(Queue)
- ๋จผ์ ๋ฃ์ ๋ฐ์ดํฐ๋ฅผ ๋จผ์ ๊บผ๋ผ ์ ์๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ (FIFO, LILO)
์คํ(Stack)
- ๋์ค์ ๋ฃ์ ๋ฐ์ดํฐ๋ฅผ ๋จผ์ ๊บผ๋ผ ์ ์๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ (FILO, LIFO)
๋งํฌ๋๋ฆฌ์คํธ(LinkedList)
- ๋จ์ด์ ธ ์๋ ๋ฐ์ดํฐ๋ฅผ ํฌ์ธํฐ๋ก ์ฐ๊ฒฐํด์ ๊ด๋ฆฌํ๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ
- LinkedList
- LinkedList๋ ๋ฐ์ดํฐ์ ๋ค์ ๋ ธ๋์ ์ฃผ์๋ฅผ ๊ฐ์ง๊ณ ์๋(ํฌ์ธํฐ) ๊ตฌ์กฐ
- ArrayList์ ๊ฐ์ด ๋ฐ์ดํฐ์ ์ถ๊ฐ,์ญ์ ์ ๋ถํ์ํ ๋ฐ์ดํฐ์ ๋ณต์ฌ๊ฐ ์์ด ๋ฐ์ดํฐ์ ์ถ๊ฐ,์ญ์ ์ ๋ฆฌ
- ๋ฐ์ดํฐ์ ๊ฒ์์์๋ ์ฒ์๋ถํฐ ๋ ธ๋๋ฅผ ์ํํด์ผ ํ๊ธฐ ๋๋ฌธ์ ์ฑ๋ฅ์ ๋ถ๋ฆฌ
- ์ค๊ฐ ๋ฐ์ดํฐ ์ญ์ ์, ์๋ค ๋ฐ์ดํฐ์ ์ฐ๊ฒฐ์ ์ฌ๊ตฌ์ฑํด์ผ ํ๋ ๋ถ๊ฐ์ ์ธ ์์ ํ์
- ๋ฐ์ดํฐ๊ฐ ๋ง์ ์๋ก ์ ๊ทผ์ฑ์ด ๋จ์ด์ง
- ArrayList
- ArrayList๋ ๋ฐ์ดํฐ์ ์ถ๊ฐ,์ญ์ ๋ฅผ ์ํด ์์ ๋ฐฐ์ด์ ์์ฑํด ๋ฐ์ดํฐ๋ฅผ ๋ณต์ฌ ํ๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉ
- ๋๋์ ์๋ฃ๋ฅผ ์ถ๊ฐ/์ญ์ ํ๋ ๊ฒฝ์ฐ์๋ ๊ทธ๋งํผ ๋ฐ์ดํฐ์ ๋ณต์ฌ๊ฐ ๋ง์ด ์ผ์ด๋๊ฒ ๋์ด ์ฑ๋ฅ ์ ํ
- ๋ฐ๋ฉด ๊ฐ ๋ฐ์ดํฐ๋ ์ธ๋ฑ์ค๋ฅผ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ ํ๋ฒ์ ์ฐธ์กฐ๊ฐ ๊ฐ๋ฅํด ๋ฐ์ดํฐ์ ๊ฒ์์๋ ์ ๋ฆฌํ ๊ตฌ์กฐ
- ๋นํจ์จ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ
- ArrayList/LinkedList ๋ ๋ค ๋ฐ์ดํฐ ๊ณต๊ฐ์ ๋ฐฐ์ด์ฒ๋ผ ๋ฏธ๋ฆฌ ํ ๋นํ์ง ์์๋ ๋จ
ํด์ฌ(Hash)
- Kye์ ๋ฐ์ดํฐ๋ฅผ ๋งคํํ ์ ์๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ (Key, Value ํํ)
- hashmap,hashtable ์ฐจ์ด (map ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ํด๋์ค)
- hashtable ๋๊ธฐํ๊ฐ ๋ณด์ฅ๋๋ map ๊ณ์ด์ ํด๋์ค, null ๊ฐ ํ์ฉ ์ํจ, ๋ฉํฐ ์ฐ๋ ๋ ์ฌ์ฉ ์ ํฉ
- hashmap ๋๊ธฐํ๊ฐ ๋ณด์ฅ๋์ง ์๋ map ๊ณ์ด์ ํด๋์ค, null ๊ฐ ํ์ฉ, ๋ฉํฐ ์ฐ๋ ๋ ์ฌ์ฉ ๋ถ์ ํฉ
ํ(Heap)
- ๋ฐ์ดํฐ์์ ์ต๋๊ฐ๊ณผ ์ต์๊ฐ์ ๋น ๋ฅด๊ฒ ์ฐพ๊ธฐ ์ํด ๊ณ ์๋ ์์ ์ด์งํธ๋ฆฌ
ํธ๋ฆฌ(Tree)
- Node์ Branch๋ฅผ ์ด์ฉํด์, ์ฌ์ดํด์ ์ด๋ฃจ์ง ์๋๋ก ๊ตฌ์ฑํ ๋ฐ์ดํฐ ๊ตฌ์กฐ
- ์ด์งํธ๋ฆฌ(Binary Tree) ํํ์ ๊ตฌ์กฐ๋ก, ํ์(๊ฒ์) ์๊ณ ๋ฆฌ์ฆ ๊ตฌํ์ ์ํด ๋ง์ด ์ฌ์ฉ๋จ
BFS(๋๋น์ฐ์ ํ์)
- ์ ์ ๋ค๊ณผ ๊ฐ์ ๋ ๋ฒจ์ ์๋ ๋
ธ๋๋ค์ ๋จผ์ ํ์ํ๋ ๋ฐฉ์, Queue๋ก ๊ตฌํ
DFS(๊น์ด์ฐ์ ํ์)
- ์ ์ ์ ์์๋ค์ ๋จผ์ ํ์ํ๋ ๋ฐฉ์, Stack์ผ๋ก ๊ตฌํ
Greedy(ํ์) ์๊ณ ๋ฆฌ์ฆ
- ์ฌ๋ฌ ๊ฒฝ์ฐ ์ค ํ๋๋ฅผ ๊ฒฐ์ ํด์ผํ ๋๋ง๋ค, ๋งค์๊ฐ ์ต์ ์ด๋ผ๊ณ ์๊ฐ๋๋ ๊ฒฝ์ฐ๋ฅผ ์ ํํ๋ ๋ฐฉ์์ผ๋ก ์งํํด์, ์ต์ข ์ ์ธ ๊ฐ์ ๊ตฌํ๋ ๋ฐฉ์
main
public class MainProcess {
public static void main(String[] args) {
ArrayList<Integer> data = new ArrayList<Integer>();
for (int i=0; i<100; i++) {
data.add((int)(Math.random()*100));
}
System.out.println("MergeSort result : " + MergeSort.mergeSplitFunc(data));
System.out.println("QuickSort result : " + QuickSort.sort(data));
System.out.println("factorial result : " + factorial(5));
binarySearch(11, quickSort(data));
}
}
factorial
public static int factorial(int num) {
if (num > 1) {
return num * factorial(num - 1);
} else {
return num;
}
}
quicksort
import java.util.ArrayList;
import java.util.Arrays;
public class QuickSort {
public QuickSort() {
// TODO Auto-generated constructor stub
}
public static 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) {
leftArr.add(dataList.get(index));
} else {
rightArr.add(dataList.get(index));
}
}
ArrayList<Integer> mergedAll = new ArrayList<Integer>();
mergedAll.addAll(sort(leftArr));
mergedAll.addAll(Arrays.asList(pivot));
mergedAll.addAll(sort(rightArr));
return mergedAll;
}
}
binarysearch
private static void binarySearch(int key, List<Integer> list) {
int mid;
int left = 0;
int right = list.size() - 1;
while (true) {
if (right >= left) {
mid = (left + right) / 2;
if (key == list.get(mid)) {
System.out.println(key + " is " + mid + "th index.");
break;
}
if (key < list.get(mid)) {
right = mid - 1;
}else{
left = mid + 1;
}
}else if(right < left){
System.out.println(key + " is not found.");
break;
}
}
}
mergesort
import java.util.ArrayList;
public class MergeSort {
public MergeSort() {
// TODO Auto-generated constructor stub
}
public static ArrayList<Integer> mergeSplitFunc(ArrayList<Integer> dataList) {
if (dataList.size() <= 1) {
return dataList;
}
int medium = dataList.size() / 2;
ArrayList<Integer> leftArr = new ArrayList<Integer>();
ArrayList<Integer> rightArr = new ArrayList<Integer>();
leftArr = mergeSplitFunc(new ArrayList<Integer>(dataList.subList(0, medium)));
rightArr = mergeSplitFunc(new ArrayList<Integer>(dataList.subList(medium, dataList.size())));
return mergeFunc(leftArr, rightArr);
}
public static ArrayList<Integer> mergeFunc(ArrayList<Integer> leftList, ArrayList<Integer> rightList) {
ArrayList<Integer> mergedList = new ArrayList<Integer>();
int leftPoint = 0;
int rightPoint = 0;
// CASE1 : left,right ๋ ๋ค ์์ ๋
while (leftList.size() > leftPoint && rightList.size() > rightPoint) {
if (leftList.get(leftPoint) > rightList.get(rightPoint)) {
mergedList.add(rightList.get(rightPoint));
rightPoint += 1;
} else {
mergedList.add(leftList.get(leftPoint));
leftPoint += 1;
}
}
// CASE2 : right ๋ฐ์ดํฐ ์์ ๋
while (leftList.size() > leftPoint) {
mergedList.add(leftList.get(leftPoint));
leftPoint += 1;
}
// CASE3 : left ๋ฐ์ดํฐ ์์ ๋
while (rightList.size() > rightPoint) {
mergedList.add(rightList.get(rightPoint));
rightPoint += 1;
}
return mergedList;
}
}