아무거나 내꺼 공부할래
두 배열 합치기 / c / 제한시간 없음 본문
▣ 문제
오름차순으로 정렬이 된 두 배열이 주어지면 두 배열을 오름차순으로 합쳐 출력하는 프로그램 을 작성하세요.
▣ 입력설명
- 첫번째 줄에 첫 번째 배열의 크기 N(1<=N<=100)이 주어집니다. 두 번째 줄에 N개의 배열 원소가 오름차순으로 주어집니다. 세 번째 줄에 두 번째 배열의 크기 M(1<=M<=100)이 주어집니다. 네 번째 줄에 M개의 배열 원소가 오름차순으로 주어집니다. 각 배열의 원소는 int형 변수의 크기를 넘지 않습니다.
▣ 출력설명
- 오름차순으로 정렬된 배열을 출력합니다.
▣ 입력 예시
3 1 3 5 5 2 3 6 7 9 |
▣ 출력 예시
1 2 3 3 5 6 7 9 |
<내 코드>
#pragma warning(disable:4996)
#include <stdio.h>
int main() {
int n, m, i, j;
int arr1[100];
int arr2[100];
int res[200];
int pos;
int temp;
scanf("%d", &n);
for (i = 0; i < n; i++)scanf("%d", &arr1[i]);
scanf("%d", &m);
for (i = 0; i < m; i++)scanf("%d", &arr2[i]);
for (i = 0; i < n; i++) {
res[i] = arr1[i];
}
pos = i;
for (i = 0; i < m; i++) {
res[pos + i] = arr2[i];
}
for (i = 1; i < n + m; i++) {
temp = res[i];
for (j = i - 1; j >= 0; j--) {
if (res[j] > temp)
res[j + 1] = res[j];
else break;
}
res[j + 1] = temp;
}
for (i = 0; i < n + m; i++) printf("%d ", res[i]);
return 0;
}
pos변수로 arr1이 끝나는 지점을 저장하고 arr2를 마저 저장시킨다.
정렬은 삽입정렬을 사용함.
<수정한 코드>
#pragma warning(disable:4996)
#include <stdio.h>
int main() {
int n, m, i;
int arr1[100];
int arr2[100];
int res[200];
int p1 = 0, p2 = 0, p3 = 0;
scanf("%d", &n);
for (i = 0; i < n; i++) scanf("%d", &arr1[i]);
scanf("%d", &m);
for (i = 0; i < m; i++) scanf("%d", &arr2[i]);
while (p1 < n && p2 < m) {
if (arr1[p1] < arr2[p2]) {
res[p3++] = arr1[p1++];
}
else {
res[p3++] = arr2[p2++];
}
}
while (p1 < n) res[p3++] = arr1[p1++];
while (p2 < m)res[p3++] = arr2[p2++];
for (i = 0; i < p3; i++) printf("%d ", res[i]);
return 0;
}
p1, p2, p3는 각각 arr1, arr2, res 배열의 커서를 나타낸다.
.
이 방법은 후에 '병합정렬'에서 비슷하게 쓰이는 코드이기 때문에 알아두면 좋을것
'[c언어&c++] 알고리즘 공부 > 인프런(Inflearn)' 카테고리의 다른 글
연속된 자연수의 합 / c / 제한시간 없음 (0) | 2021.01.26 |
---|---|
교집합(투포인터 알고리즘, MS인터뷰) / c / 제한시간 : 1초 (0) | 2021.01.26 |
Inversion Sequence / c / 제한시간 없음 (0) | 2021.01.25 |
LRU(Least Recently Used, 카카오 캐시 문제 변형, 삽입정렬 응용) / c / 제한시간 없음 (0) | 2021.01.25 |
Special Sort(Google 인터뷰) / c / 제한시간 없음 (0) | 2021.01.22 |