This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| algorithm:algorithm [2016/06/07 13:12] – ledyx | algorithm:algorithm [2022/10/24 15:32] (current) – ledyx | ||
|---|---|---|---|
| Line 3: | Line 3: | ||
| {{tag> | {{tag> | ||
| - | = 마방진 (Magic Square) | + | = Recursion |
| - | * 홀수만 처리 가능! | + | [[recursion|참조]] |
| - | <sxh java ; title: | + | |
| - | int size = 5; | + | |
| - | + | ||
| - | int[][] arr = new int[size][size]; | + | |
| - | + | ||
| - | int middle = size/2; | + | |
| - | + | ||
| - | int i=0, j=middle; | + | |
| - | for(int num=1 ; num< | + | |
| - | arr[i][j] = num; | + | |
| - | + | ||
| - | //행 감소 | + | |
| - | i--; | + | |
| - | if(i < 0) | + | |
| - | i = size-1; | + | |
| - | + | ||
| - | //열 증가 | + | |
| - | j = (++j)%size; | + | |
| - | //아래 표현과 같다. | + | |
| - | /*j++; | + | |
| - | if(j >= size) | + | |
| - | j = 0;*/ | + | |
| - | + | ||
| - | // | + | |
| - | if(num%size == 0) { | + | |
| - | i = (i+2)%size; | + | |
| - | j--; | + | |
| - | if(j < 0) | + | |
| - | j = size-1; | + | |
| - | } | + | |
| - | } | + | |
| - | </ | + | |
| = Sort = | = Sort = | ||
| Line 48: | Line 16: | ||
| = Search = | = Search = | ||
| - | == 이진 탐색 | + | == Binary Search (이진 탐색) == |
| - | * 일반적인 구현 | + | [[binary search|참조]] |
| - | <sxh java> | + | |
| - | public static int binarySearch(int[] arr, int target) { | + | |
| - | int left = 0; | + | |
| - | int right = arr.length - 1; | + | |
| - | int mid = 0; | + | |
| - | + | ||
| - | while(left <= right) { | + | |
| - | mid = (left + right) / 2; | + | |
| - | + | ||
| - | if(arr[mid] < target) | + | |
| - | left = mid + 1; | + | |
| - | else if (arr[mid] > target) | + | |
| - | right = mid - 1; | + | |
| - | else | + | |
| - | return mid; | + | |
| - | } | + | |
| - | + | ||
| - | return Integer.MIN_VALUE; | + | |
| - | } | + | |
| - | </ | + | |
| - | + | ||
| - | + | ||
| - | * 재귀적 구현 | + | |
| - | <sxh java> | + | |
| - | public static int binarySearchRecursive(int[] arr, int target, int left, int right) { | + | |
| - | if(left > right) | + | |
| - | return Integer.MIN_VALUE; | + | |
| - | + | ||
| - | int mid = (left + right) / 2; | + | |
| - | if(arr[mid] < target) | + | |
| - | return binarySearchRecursive(arr, | + | |
| - | else if (arr[mid] > target) | + | |
| - | return binarySearchRecursive(arr, | + | |
| - | else | + | |
| - | return mid; | + | |
| - | } | + | |
| - | </ | + | |
| - | + | ||
| - | + | ||
| - | * A < X ≤ B 조건을 검색. (반환값이 index+1 이므로) | + | |
| - | <sxh java> | + | |
| - | public static int binarySearch(ArrayList< | + | |
| - | + | ||
| - | int left = 0; | + | |
| - | int right = list.size() - 1; | + | |
| - | int middle = 0; | + | |
| - | + | ||
| - | while(left <= right) { | + | |
| - | + | ||
| - | middle = (left + right) / 2; | + | |
| - | + | ||
| - | if(target < list.get(middle)) { | + | |
| - | right = middle - 1; | + | |
| - | } | + | |
| - | else { | + | |
| - | left = middle + 1; | + | |
| - | } | + | |
| - | + | ||
| - | if(list.get(middle) <= target && middle < list.size() - 1) { | ||
| - | if(target < list.get(middle + 1)) { | ||
| - | return list.get(list.size() > middle + 1 ? middle + 1 : list.size() - 1); | ||
| - | } | ||
| - | } | ||
| - | } | ||
| - | |||
| - | return -1; | ||
| - | } | ||
| - | </ | ||