반응형
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 | #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> void quickSort(int *data, int start, int end) { if (start >= end) { //원소가 1개인 경우 return; //바로 return } int key = start; //키(피벗값잡기)는 첫번째 원소 int i = start + 1; //왼쪽부터 하나씩 큰값을 찾을 때의 인덱스 int j = end; // i는 왼쪽 출발 지점, j는 오른쪽 출발 지점 int temp; //임시 변수 while (i <= j) { //엇갈릴 때까지 반복 while (data[i] <= data[key] && i <= end) {//i가 키값보다 큰 값을 만날 때까지 i++; //오른쪽으로 이동 } while (data[j] >= data[key] && j > start) {//키 값보다 작은 값을 만날때까지, j>start로 제한을 걸어둬야 설령 j값이 항상 key(피벗)값보다 커도배열을 벗어나지 않는다. j--; //j를 오른쪽으로 이동 } if (i > j) {//현재 엇갈린 상태이면 키값과 교체 temp = data[j]; data[j] = data[key]; data[key] = temp; } else {//엇갈리지 않았다면 j값과 i값 교체 temp = data[j]; data[j] = data[i]; data[i] = temp; } } quickSort(data, start, j - 1);//이전 피벗값의 왼쪽에서 정렬수행 quickSort(data, j + 1, end); //이전 피벗값의 오른쪽에서 정렬수행 } int main() { int n_size, m_size, left = 0, right, mid, temp; int n_numPtr[100000] = { 0, }; int m_numPtr[100000] = { 0, }; scanf("%d", &n_size); //탐색하는 배열의 사이즈 입력 for (int i = 0; i < n_size; i++) //탐색하는 배열에 요소 입력 scanf("%d", &n_numPtr[i]); quickSort(n_numPtr, 0, n_size - 1); /*for (int i = 0; i < n_size; i++)//탐색하는 배열 정렬 { for (int j = 0; j < n_size-1; j++) { if (n_numPtr[j] > n_numPtr[j+1]) { temp = n_numPtr[j]; n_numPtr[j] = n_numPtr[j+1]; n_numPtr[j+1] = temp; } } } */ scanf("%d", &m_size);//찾고자 하는 배열 사이즈 입력 for(int i=0;i<m_size;i++) scanf("%d", &m_numPtr[i]); for (int i = 0; i < m_size; i++) { left = 0; right = n_size - 1; while (left <= right) { //바로 이분탐색 시작; mid = (left + right) / 2; if (n_numPtr[mid] > m_numPtr[i]) //탐색배열의 가운데 요소가 찾고자 하는 값보다 크다면 right = mid - 1; //오른쪽 인덱스를 가운데 인덱스 -1 else if (n_numPtr[mid] < m_numPtr[i]) //탐색 배열의 가운데 요소가 작다면 left = mid + 1; //왼쪽 인덱스를 가운데 인덱스 +1 else //탐색배열의 가운데값과 찾고자 하는 값이 같다면 종료 break; } if (n_numPtr[mid] == m_numPtr[i]) printf("1\n"); else printf("0\n"); } } | cs |
반응형
'프로그래밍 > 백준' 카테고리의 다른 글
[2960] 에라토스테네스의 체 (0) | 2019.08.18 |
---|---|
[2579]계단오르기 (0) | 2019.07.07 |