프로그래밍/백준

[1920] 수 찾기

ajdanddl 2019. 7. 27. 16:54
반응형
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 + 1end); //이전 피벗값의 오른쪽에서 정렬수행 
 
}
 
 
 
 
 
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