728x90
▶문제 : 기억력 테스트 3 (codeup.kr)
▶코드 작성
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n, m;
int *arr, *num;
int left, right, mid;
scanf("%d", &n);
arr = (int *)malloc(sizeof(int) * n);
for (int i = 0; i < n; i++)
{
scanf("%d", &arr[i]);
}
scanf("%d", &m);
num = (int *)malloc(sizeof(int) * m);
for (int i = 0; i < m; i++)
{
scanf("%d", &num[i]);
}
for (int i = 0; i < m; i++)
{
left = 0;
right = n - 1;
while (left <= right)//이진 탐색
{
mid = (left + right) / 2;//중앙값을 구하기 위해
if (num[i] < arr[mid])//중앙값보다 작다면
{
right = mid - 1;//오른쪽 배열자리수를 중앙값에서 더 작은 수로 설정
}
else if (num[i] > arr[mid])//중앙값보다 크면
{
left = mid + 1;//왼쪽 배열자리수를 중앙값에서 더 큰 수로 설정
}
else if (num[i] == arr[mid])//찾고자 하는 수를 찾았다면
{
break;//while문 종료
}
}
if (num[i] == arr[mid])
{
printf("%d ", mid + 1);
}
else
{
printf("-1 ");
}
}
free(arr);
free(num);
return 0;
}
▶해석
이진 탐색을 이용하여 변수 left right를 배열의 끝과 끝인 0과 n-1로 정하고 while문으로 중앙값인 mid를 left와 right를 이용해 구한 후, 찾고자 하는 값 num [i]과 오름차순 배열의 중앙값 arr [mid]를 비교해 num [i] 값이 작다면 오른쪽 값 right를 mid에서 -1 한 값으로 저장하여 다시 mid값을 구하고, num [i] 값이 작다면 왼쪽 값 left를 mid에서 +1 한 값으로 저장하여 다시 mid값을 구하고를 반복해 같은 값을 찾거나 못 찾아서 left> right가 되었을 때 while문 종료를 한다.
728x90
'코드업(codeup) > C' 카테고리의 다른 글
코드업(codeup) 3017 : 정렬 기준 C언어 (0) | 2021.12.25 |
---|---|
코드업(codeup) 3014 : 정렬을 빠르게! C언어 (0) | 2021.12.12 |
코드업(codeup) 2033 : 사다리 게임 C언어 (0) | 2021.12.03 |
코드업(codeup) 2008 : 오름차순? 내림차순? 2 C언어 (0) | 2021.12.03 |
코드업(codeup) 1807 : 우박수 길이 (3n+1) (small) C언어 (0) | 2021.12.02 |
댓글