입력 코드
#include <stdio.h>
int intcmp(const void *pa, const void *pb) {
return *(int *)pa > *(int *)pb ? 1 : (*(int *)pa < *(int *)pb ? -1 : 0);
}
int binarySearch(int *arr, int key, int size) {
//arr = 배열a[], key = 배열b[i], size = 배열a의 길이 n
int front, mid, rear;
front = 0; rear = size - 1;
while (1) {
mid = (front + rear) / 2;
if (arr[mid] == key) return 1;
if (arr[front] == key) return 1;
if (arr[rear] == key) return 1;
if (arr[mid] < key) front = mid + 1;
else rear = mid - 1;
if (rear <= front) return 0;
}
}
int main() {
int i, n, m, a[100000], b[100000];
scanf("%d", &n);
for (i = 0; i < n; i++) scanf("%d", &a[i]);
qsort(a, n, sizeof(int), intcmp);
scanf("%d", &m);
for (i = 0; i < m; i++) {
scanf("%d", &b[i]);
b[i] = binarySearch(a, b[i], n);
}
for (i = 0; i < m; i++) printf("%d\n", b[i]);
}
코드 설명
#이분 탐색 #정렬
이분 탐색을 하려면 정렬이 되어있어야 하는데 정렬을 하려면 또 정렬 알고리즘을 이용해야 한다.
#include <stdio.h>
main() {
int N, M;
scanf("%d", &N);
int arrN[100000], arrM[100000];
int i, j, key;
for (i = 0; i < N; i++) {
scanf("%d", &arrN[i]);
}
for (i = 0; i < N-1; i++) {
j = i;
while (j >= 0 && arrN[j] > arrN[j + 1]) {
key = arrN[j];
arrN[j] = arrN[j + 1];
arrN[j + 1] = key;
j--;
}
}
scanf("%d", &M);
for (j = 0; j < M; j++) {
scanf("%d", &arrM[j]);
}
int left = 0, right = N;
for (j = 0; j < M; j++) {
while (left <= right) {
int mid = (left + right) / 2;
if (arrN[mid] > arrM[j])
right = mid - 1;
else if (arrN[mid] < arrM[j])
left = mid + 1;
else if ((arrN[mid] == arrM[j])) {
printf("1\n");
break;
}
else {
printf("0\n");
break;
}
}
}
}
그래서 정렬을 하고 나서 arrM[j]에 대해 이분 탐색을 반복하려고 했으나 중간에 break 할 지점에서 막혔다.
2021/01/25 - [C] - #47. [백준_C언어] 2750 : 수 정렬하기
#include <stdio.h>
main() {
int N, M;
scanf("%d", &N);
int arrN[100000], arrM[100000];
int i, j, key;
for (i = 0; i < N; i++) {
scanf("%d", &arrN[i]);
}
for (i = 0; i < N - 1; i++) {
j = i;
while (j >= 0 && arrN[j] > arrN[j + 1]) {
key = arrN[j];
arrN[j] = arrN[j + 1];
arrN[j + 1] = key;
j--;
}
}
scanf("%d", &M);
for (j = 0; j < M; j++) {
scanf("%d", &arrM[j]);
}
int left = 0, right = N, res;
for (j = 0; j < M; j++) {
while (left <= right) {
int mid = (left + right) / 2;
if (arrN[mid] > arrM[j])
right = mid - 1;
else if (arrN[mid] < arrM[j])
left = mid + 1;
else if ((arrN[mid] == arrM[j]))
res = 1;
else
res = 0;
}
if (res == 1)
printf("1\n");
else if (res == 0)
printf("0\n");
}
}
새로운 변수 res 를 선언해서 출력을 했으나 시간 초과
그래서 다른 방법을 찾아보다가 퀵 정렬을 이용한 풀이를 발견했다.
↓↓↓ 참고한 사이트
m.blog.naver.com/occidere/220784779848
[백준] 1920 - 수 찾기
문제 링크 : https://www.acmicpc.net/problem/1920 접근 방식 : 간단히 생각하면 쉽다. 말그대로 맨날 하...
blog.naver.com
이분 탐색
이분 탐색 알고리즘(Binary Search Algorithm)
Binary Search Algorithm Binary Search Algorithm - 오름차순으로 정렬된 리스트에서 특정 값의 위치를 찾는 알고리즘 - 모든 값을 순회해야 하는 일반적인 Search보다 더 빠르다는 장점이 있음 - 중앙값을 찾
dongdd.tistory.com
[알고리즘] 이분 탐색
이분 탐색 탐색 기법중에 하나로 원하는 탐색범위를 두 부분으로 분할해서 찾는 방식입니다. 그렇기에 원래의 전부를 탐색하는 탐색 속도에 비해 빠릅니다. 이분 탐색을 하는 방법은 left , right
wootool.tistory.com
퀵 정렬
https://terms.naver.com/entry.nhn?cid=51173&categoryId=51173&docId=2270444
퀵 정렬
퀵 정렬(quick sort)은 기준키를 기준으로 작거나 같은 값을 지닌 데이터는 앞으로, 큰 값을 지닌 데이터는 뒤로 가도록 하여 작은 값을 갖는 데이터와 큰 값을 갖는 데이터로 분리해가며 정렬하는
terms.naver.com
dojang.io/mod/page/view.php?id=638
C 언어 코딩 도장: 73.2 퀵 정렬 함수 사용하기
이번에는 퀵 정렬 함수를 사용해보겠습니다. 퀵 정렬 함수에는 정렬할 배열 또는 메모리의 주소, 요소 개수, 요소 크기, 비교 함수를 넣어줍니다(stdlib.h 헤더 파일에 선언되어 있습니다). qsort(정
dojang.io
문제 출처
1920번: 수 찾기
첫째 줄에 자연수 N(1 ≤ N ≤ 100,000)이 주어진다. 다음 줄에는 N개의 정수 A[1], A[2], …, A[N]이 주어진다. 다음 줄에는 M(1 ≤ M ≤ 100,000)이 주어진다. 다음 줄에는 M개의 수들이 주어지는데, 이 수들
www.acmicpc.net
'C' 카테고리의 다른 글
#54. [백준_C언어] 2164 : 카드2 (0) | 2021.01.28 |
---|---|
#53. [백준_C언어] 1978 : 소수 찾기 (0) | 2021.01.28 |
#51. [백준_C언어] 1181 : 단어 정렬 (0) | 2021.01.27 |
#50. [백준_C언어] 1018 : 체스판 다시 칠하기 (0) | 2021.01.26 |
#49. [백준_C언어] 2740 : 행렬 곱셈 (0) | 2021.01.26 |