먼저 교집합을 구한다.
그리고 A+B - A∩B를 해서 합집합을 구한다.
#include <stdio.h> // 교집합과 합집합 구하기 int main() { int i; int j; int k; int tmp; int x[] = {0,2,1,3,5,4,9,7,8,6,10}; int y[] = {0,7,4,8,5,9,14,11,17,19}; int lx; int ly; int in[100]; int un[100]; int incnt = 0; int uncnt = 0; int max = 0; lx = sizeof(x) / sizeof(x[0]) - 1; ly = sizeof(y) / sizeof(y[0]) - 1; // 교집합 구하기 for (i=1;i<=lx;i++) { for (j=1;j<=ly;j++) { if ( x[i] == y[j] ) { incnt = incnt + 1; in[incnt] = x[i]; // 정렬 for (k=incnt;k>1;k--) { if (in[k] < in[k-1]) { tmp = in[k-1]; in[k-1] = in[k]; in[k] = tmp; } }break; } } } printf("Intersect: "); for (i=1;i<=incnt;i++) printf( "%d ", in[i]); printf("\n"); // 합집합 구하기 for (i=1;i<=lx;i++) { un[i] = x[i]; if ( un[i] > max) max = un[i]; } for (;i<=lx+ly;i++) { un[i] = y[i-lx]; if ( un[i] > max) max = un[i]; } max = max + 1; for (i=lx+1;i<=lx+ly;i++) { for (j=1;j<=incnt;j++) {if ( un[i] == in[j]) { un[i] = max; //삭제를 위해 제일 큰수 + 1 로 마킹 break; } } } uncnt = lx + ly; // 버블 정렬 (max + 1로 마킹된 요소는 맨 뒤로 이동됨) for (i=1;i<=uncnt;i++) { for(j=i;j<=uncnt;j++) { if ( un[i] > un[j]) { tmp = un[i]; un[i] = un[j]; un[j] = tmp; } } } uncnt = lx + ly - incnt; printf("Union: "); for (i=1;i<=uncnt;i++) printf("%d ",un[i]); return 0; }
* 피시키드님에 의해서 게시물 이동되었습니다 (2024-04-26 18:49)