입력으로 주어지는 배열 A[0..n-1]은 오름차순으로 정렬되어 있으며 n 개의 서로 다른 정수들을 원소로 가진다. 즉, A[0] < A[1] < … < A[n-1] 이다. 원소들은 양수, 음수 혹은 0일 수 있다.
(a) A[i]=i를 만족하는 index i가 존재하는지 알고 싶다. 그런 index i가 존재하면 찾아서 i를 출력하고, 없으면 -1을 출력하는 알고리즘을 설계하시오.
(b) 배열 A의 원소들이 모두 0 혹은 양수라는 조건이 성립한다면, 위의 문제를 해결하는 더 빠른 알고리즘이 가능하다. 어떻게 할 수 있을까?
더보기
Solution
(a)
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void value_equals_index(int *arr,int current,int size,int count)
{
if(current>=size || arr[current]>current)
{
if(count==0)
printf("-1");
printf("\n");
return;
}
else if(arr[current]==current)
{
printf("%d ", current);
value_equals_index(arr,current+1,size,count+1);
}
else
value_equals_index(arr,current+1,size,count);
}
int main(void)
{
int size, *arr=NULL;
srand((unsigned)time(NULL));
printf("size: ");
scanf("%d", &size);
arr=(int *)malloc(size*sizeof(int));
for(int i=0;i<size;i++)
{
int flag=0;
do
{
flag=0;
arr[i]=rand()%100-50;
for(int j=0;j<i;j++)
if(arr[i]==arr[j])
{
flag=1;
break;
}
}
while(flag);
}
for(int i=0;i<size-1;i++)
for(int j=i+1;j<size;j++)
if(arr[i]>arr[j])
{
int temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
printf("sorted array: ");
for(int i=0;i<size;i++)
printf("%d ", arr[i]);
printf("\n");
value_equals_index(arr,0,size,0);
free(arr);
return 0;
}
(b)
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void value_equals_index(int *arr,int current,int size,int count)
{
if(current>=size || arr[current]!=current) //이 부분이 바뀜: >에서 !=으로 -> 더 빠른 종료조건
{
if(count==0)
printf("-1");
printf("\n");
return;
}
else if(arr[current]==current)
{
printf("%d ", current);
value_equals_index(arr,current+1,size,count+1);
}
else
value_equals_index(arr,current+1,size,count);
}
int main(void)
{
int size, *arr=NULL;
srand((unsigned)time(NULL));
printf("size: ");
scanf("%d", &size);
arr=(int *)malloc(size*sizeof(int));
for(int i=0;i<size;i++)
{
int flag=0;
do
{
flag=0;
arr[i]=rand()%100;
for(int j=0;j<i;j++)
if(arr[i]==arr[j])
{
flag=1;
break;
}
}
while(flag);
}
for(int i=0;i<size-1;i++)
for(int j=i+1;j<size;j++)
if(arr[i]>arr[j])
{
int temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
printf("sorted array: ");
for(int i=0;i<size;i++)
printf("%d ", arr[i]);
printf("\n");
value_equals_index(arr,0,size,0);
free(arr);
return 0;
}
728x90
'C언어 알고리즘' 카테고리의 다른 글
<C언어 알고리즘> qsort() 함수를 사용한 퀵정렬 (0) | 2023.10.15 |
---|---|
<C언어 알고리즘> 최대합 부분배열 (0) | 2020.04.11 |
<C언어 알고리즘> 정렬 후 회전된 배열 (0) | 2020.04.10 |
<C언어 알고리즘> 반복문을 사용하지 않고 합계 구하기 (0) | 2020.04.09 |
<C언어 알고리즘> 반복문을 사용하지 않고 선택정렬 (0) | 2020.04.09 |