Notice
Recent Posts
Recent Comments
Link
«   2024/10   »
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
Tags
more
Archives
Today
Total
관리 메뉴

아무거나 내꺼 공부할래

두 배열 합치기 / c / 제한시간 없음 본문

[c언어&c++] 알고리즘 공부/인프런(Inflearn)

두 배열 합치기 / c / 제한시간 없음

mero95 2021. 1. 26. 13:45

▣ 문제

오름차순으로 정렬이 된 두 배열이 주어지면 두 배열을 오름차순으로 합쳐 출력하는 프로그램 을 작성하세요.

 

▣ 입력설명

- 첫번째 줄에 첫 번째 배열의 크기 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 배열의 커서를 나타낸다.

 

.

 

이 방법은 후에 '병합정렬'에서 비슷하게 쓰이는 코드이기 때문에 알아두면 좋을것