반응형
10개의 난수(100보다 작은)를 발생시키고 몇 번째 작은 수를 찾을 것인가를 입력받은 후 그 수를 출력하는 프로그램을 작성하라.
입력 :
Enter the number of numbers : 10
몇번째로 작은 수 : 4
출력 :
894 250 65 688 99 966 296 649 455 305
4번째로 작은 수는 296
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void init_array(int list[], int n) {
srand(time(NULL));
for (int i = 0; i < n; i++)
*(list + i) = rand() % 100;
}
void print_array(int list[], int n) {
for (int i = 0; i < n; i++)
printf("%3d ", list[i]);
}
void swap(int A[], int i, int j) {
int temp = A[j];
A[j] = A[i];
A[i] = temp;
}
int partition(int A[], int p, int r) { //퀵 정렬의 partition
int i = p - 1;
int j = p;
int pivot = A[r];
while (j < r) {
if (A[j] < pivot) {
swap(A, ++i, j);
}
j++;
}
swap(A, ++i, j);
r = i;
return r;
}
int find(int A[], int p, int r, int orderIndex) {
int q;
if (p <= r) {
q = partition(A, p, r);
if (orderIndex == q)
return A[orderIndex]; //찾으면 그 수 반환
else if (orderIndex < q) //찾고자 하는 수의 인덱스가 partition보다 작으면 왼쪽에서 찾기
find(A, p, q - 1, orderIndex);
else
find(A, q + 1, r, orderIndex); //크면 오른쪽에서 찾기
}
}
int main(void) {
int num, order;
int *list;
printf("Enter the number of numbers: ");
scanf("%d", &num);
printf("몇번째로 작은 수: ");
scanf("%d", &order);
list = (int*)malloc(sizeof(int) * num);
init_array(list, num);
print_array(list, num);
int order_num = find(list, 0, num - 1, order-1);
printf("\n%d번째 작은 수는 : %d\n", order, order_num);
free(list);
}
반응형
'⚙️ 알고리즘 > 기타 문제 & 풀이' 카테고리의 다른 글
[C] 조합, 순열, 중복조합, 중복순열 (0) | 2020.08.04 |
---|---|
[C] 순환을 이용한 배열에서 최대값 찾기 (0) | 2020.07.23 |
[C] 사이클 길이(순환) (0) | 2020.07.23 |
[C] 하노이탑(the tower of hanoi) 재귀 (2) | 2020.07.23 |
[C] 문자열을 입력받아 첫 번째로 등장하는 단어 출력 (0) | 2020.07.18 |