[C언어] 두 배열을 정렬된 형태로 합치는 2가지 방법
안녕하세요 이번 포스팅은 두 배열을 하나의 정렬된 형태로 만드는 방법에 대해 소개해드리겠습니다.
두 배열을 합치는 방법으로는
-1. 정렬된 두 배열을 탐색하여 두 배열중 최소 값들로 업데이트
-2. 두 배열을 하나로 합친 뒤 오름차순 정렬
1. 최소 값 업데이트로 배열 합치기
두 배열을 모두 탐색하여 그중 최솟값을 찾는 방법입니다.
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
|
#include <stdio.h>
#define ArrLen1 7
#define ArrLen2 5
int main()
{
int arr1[ArrLen1] = {5,3,1,6,8,9,15};
int arr2[ArrLen2] = {4,2,7,13,11};
int arr3[ArrLen1 + ArrLen2] ={};
printf("\nArr1 의 요소: ");
for(int i = 0; i < ArrLen1; i++)
{
printf("%d ",arr1[i]);
}
//arr1 오름차순 정렬
for (int i = 0; i < ArrLen1-1; i++)
{
for (int j = 0; j < ArrLen1-i-1; j++)
{
if (arr1[j] > arr1[j+1])
{
int temp = arr1[j];
arr1[j] = arr1[j+1];
arr1[j+1] = temp;
}
}
}
printf("\n정렬된 Arr1 의 요소: ");
for(int i = 0; i < ArrLen1; i++)
{
printf("%d ",arr1[i]);
}
printf("\nArr2 의 요소: ");
for(int i = 0;i<ArrLen2;i++)
{
printf("%d ",arr2[i]);
}
//arr2 오름차순 정렬
for (int i = 0; i < ArrLen2-1; i++)
{
for (int j = 0; j < ArrLen2-i-1; j++)
{
if (arr2[j] > arr2[j+1])
{
int temp = arr2[j];
arr2[j] = arr2[j+1];
arr2[j+1] = temp;
}
}
}
printf("\n정렬된 Arr2 의 요소: ");
for(int i = 0; i < ArrLen2; i++)
{
printf("%d ",arr2[i]);
}
int i,j,k;
i = j = k = 0;
for(i=0; i < ArrLen1 && j < ArrLen2;)
{
if(arr1[i] < arr2[j])
{
arr3[k] = arr1[i];
k++;
i++;
}
else
{
arr3[k] = arr2[j];
k++;
j++;
}
}
while(i < ArrLen1)
{
arr3[k] = arr1[i];
k++;
i++;
}
while(j < ArrLen2)
{
arr3[k] = arr2[j];
k++;
j++;
}
printf("\n합쳐진 배열 요소 : ");
for(i = 0; i < ArrLen1 + ArrLen2; i++)
{
printf("%d ",arr3[i]);
}
printf("\n");
return 0;
}
|
int arr1[ArrLen1] = {5,3,1,6,8,9,15};
int arr2[ArrLen2] = {4,2,7,13,11};
로 배열이 주어졌는데 각 arr1, arr2는 오름차순으로 정렬해주어야 합니다.
14~70번 줄 까지 각각 배열을 오름차순으로 정렬해 주었습니다.
그 뒤 두 배열을 합치는 명령을 수행하게 되는데
for(i=0; i < ArrLen1 && j < ArrLen2;)
{
if(arr1[i] < arr2[j])
{
arr3[k] = arr1[i];
k++;
i++;
}
else
{
arr3[k] = arr2[j];
k++;
j++;
}
}
while(i < ArrLen1)
{
arr3[k] = arr1[i];
k++;
i++;
}
while(j < ArrLen2)
{
arr3[k] = arr2[j];
k++;
j++;
}
와 같습니다. 먼저 두 배열의 크기가 같지 않을 수 있으므로 i < ArrLen1 && j < ArrLen2 일 때까지 반복하게 되는데 그 내용으로는
if(arr1[i] < arr2[j])
{
arr3[k] = arr1[i];
k++;
i++;
}
else
{
arr3[k] = arr2[j];
k++;
j++;
}
두 배열의 요소를 비교하여 작은 값을 arr3에 넣어주고 해당 배열의 index를 증가시켜 줍니다.
저는 arr1의 길이가 7, arr2의 길이가 5이므로 arr2의 index를 전부 탐색하였다면 for문은 종료됩니다.
그 후엔
while(i < ArrLen1)
{
arr3[k] = arr1[i];
k++;
i++;
}
로 나머지 arr1의 요소를 arr3에 넣어 줍니다.
2. 두 배열을 하나로 합친 뒤 오름차순 정렬
두 배열을 하나로 합친 뒤 정렬을 통하는 방법입니다.
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
|
#include <stdio.h>
#define ArrLen1 7
#define ArrLen2 5
int main()
{
int arr1[ArrLen1] = {5,3,1,6,8,9,15};
int arr2[ArrLen2] = {4,2,7,13,11};
int arr3[ArrLen1 + ArrLen2] ={};
printf("\nArr1 의 요소: ");
for(int i = 0; i < ArrLen1; i++)
{
printf("%d ",arr1[i]);
}
printf("\nArr2 의 요소: ");
for(int i = 0;i<ArrLen2;i++)
{
printf("%d ",arr2[i]);
}
//arr1과 arr2 합치기
int i,j;
for(i = 0; i < ArrLen1; i++)
{
arr3[i] = arr1[i];
}
for(i = ArrLen1, j = 0 ; i < ArrLen1 + ArrLen2; i++, j++)
{
arr3[i] = arr2[j];
}
//arr3의 요소
printf("\nArr3 의 요소: ");
for(int i = 0;i<ArrLen1+ArrLen2;i++)
{
printf("%d ",arr3[i]);
}
//arr3 오름차순 정렬
for (int i = 0; i < ArrLen1+ArrLen2-1; i++)
{
for (int j = 0; j < ArrLen1+ArrLen2-i-1; j++)
{
if (arr3[j] > arr3[j+1])
{
int temp = arr3[j];
arr3[j] = arr3[j+1];
arr3[j+1] = temp;
}
}
}
printf("\n정렬된 arr3 요소 : ");
for(int i = 0; i < ArrLen1 + ArrLen2; i++)
{
printf("%d ",arr3[i]);
}
printf("\n");
return 0;
}
|
for(i = 0; i < ArrLen1; i++)
{
arr3[i] = arr1[i];
}
for(i = ArrLen1, j = 0 ; i < ArrLen1 + ArrLen2; i++, j++)
{
arr3[i] = arr2[j];
}
를 통해 두 배열을 합쳐줍니다.
ArrLen1의 크기만큼 arr3[i] = arr1[i] 로 arr3에 arr1의 요소를 넣어 준뒤
i의 초기값은 ArrLen1으로 arr3[ArrLen1 부터 ] = arr2[j] 로 arr2의 요소를 arr3에 넣어주면 정렬된 하나의 배열을 얻을 수 있습니다.
c언어를 공부하는 과정에서 공부한 것들을 정리한 부분입니다. 미흡한 점이 많으니 지적할 부분을 지적해주시면 감사하겠습니다.
감사합니다.
'ET의 공부 > C언어' 카테고리의 다른 글
[C언어] 두 개의 분수를 정수형으로 더하는 방법 (0) | 2020.04.09 |
---|---|
[C언어] 10진수를 2진수로 변환하는 방법 (0) | 2020.04.09 |
[C언어] 배열의 두 번째로 작은 요소를 찾는 3가지 방법 (0) | 2020.04.05 |
[C언어]조건문 if와 else 사용하기 (0) | 2019.12.19 |
[C언어] do while 문 (0) | 2019.12.11 |