반응형
#include <stdio.h>
#include <stdlib.h>
#define MAX_SET_SIZE 10
#define HAVE_ELEMENT 1
#define DO_NOT_HAVE_ELEMENT 0
int hasElement(int set[], int size, int element);
int setUnion(int set1[], int size1, int set2[], int size2, int setResult[]);
int setIntersecton(int set1[], int size1, int set2[], int size2, int setResult[]);
int setComplements(int set1[], int size1, int set2[], int size2, int setResult[]);
void printSet(int set[], int size);
int addOneElement(int set[], int size, int element);
int main(int argc, char *argv[])
{
int i = 0;
int setA[MAX_SET_SIZE];
int setB[MAX_SET_SIZE];
int setC[MAX_SET_SIZE * 2]; //합 or 교 or 차집합
int sizeA;
int sizeB;
int sizeC;
printf("Enter the size of Set A:");
scanf("%d", &sizeA);
while (i < sizeA) //집합 A가 모두 채워질 때까지 반복
{
printf("Enter the number for Set A (%d/%d):", i + 1, sizeA);
scanf("%d", &setA[i]);
i = addOneElement(setA, i, setA[i]); //원소가 추가될때마다 증가된 i 반환
}
printf("Enter the size of Set B:");
scanf("%d", &sizeB);
i = 0;
while (i < sizeB) //집합 B가 모두 채워질 때까지 반복
{
printf("Enter the number for Set B (%d/%d):", i + 1, sizeB);
scanf("%d", &setB[i]);
i = addOneElement(setB, i, setB[i]);
}
printf("Set A: ");
printSet(setA, sizeA);
printf("Set B: ");
printSet(setB, sizeB);
sizeC = setUnion(setA, sizeA, setB, sizeB, setC); //setC : 합집합 sizeC : 합집합의 크기
printf("Union of setA and setB: ");
printSet(setC, sizeC);
sizeC = setIntersecton(setA, sizeA, setB, sizeB, setC); //setB : 교집합 sizeC : 교집합의 크기
printf("Intersection of setA and setB: ");
printSet(setC, sizeC);
sizeC = setComplements(setA, sizeA, setB, sizeB, setC); //setC : 차집합 sizeC : 차집합의 크기
printf("Set-theoretic difference of setA and setB (setA - setB): ");
printSet(setC, sizeC);
return 0;
}
int hasElement(int set[], int size, int element)
{
int i = 0;
for (i = 0; i < size; i++)
if (set[i] == element)
return HAVE_ELEMENT; //원소가 있는 경우
return DO_NOT_HAVE_ELEMENT; //원소가 없는 경우
}
// 원소를 집합에 추가. 이미 존재하면 추가하지 않고 redundant라고 출력한다. 현재의 집합 크기를 반환한다.
int addOneElement(int set[], int size, int element)
{
if (!hasElement(set, size, element)) { //element를 가지고 있지 않으면,
set[size] = element; //배열에 추가
size++; //원소가 추가됐으므로 집합의 크기 증가
}
else
printf("It is redundant. Please retry.\n");
return size;
}
//집합 출력
void printSet(int set[], int size)
{
int i;
printf("{ ");
for (i = 0; i < size - 1; i++) {
printf("%d, ", set[i]);
}
printf("%d }\n", set[i]);
/*
int i;
printf("{ ");
for (i = 0; i < size; i++)
if (i < size - 1) printf("%d, ", set[i]);
else printf("%d ", set[i]);
printf("}\n");
*/
}
//합집합
int setUnion(int set1[], int size1, int set2[], int size2, int setResult[])
{
int i, j;
for (i = 0; i < size1; i++)
setResult[i] = set1[i]; //먼저 set1의 원소 모두 setResult에 추가
for (j = 0; j < size2; j++) {
if (!hasElement(setResult, i, set2[j])) { //setResult에 set2의 원소가 없으면,
setResult[i] = set2[j]; //setResult 집합에 추가
i++;
}
}
return i; //합집합의 크기
}
//교집합
int setIntersecton(int set1[], int size1, int set2[], int size2, int setResult[])
{
int i = 0, j;
for (j = 0; j < size2; j++) {
if (hasElement(set1, size1, set2[j])) //set1에 set2의 원소가 있으면, 즉 공통 원소가 있으면
setResult[i++] = set2[j]; //setResult 집합에 추가
}
return i; //교집합의 크기
}
//차집합
int setComplements(int set1[], int size1, int set2[], int size2, int setResult[])
{
int i = 0, j;
for (j = 0; j < size1; j++)
if (!hasElement(set2, size2, set1[j])) //set2에 set1의 원소가 없으면
setResult[i++] = set1[j]; //setResult 집합에 추가
return i; //차집합의 크기
}
반응형
'⚙️ 알고리즘 > 기타 문제 & 풀이' 카테고리의 다른 글
[C] 문자열 병합 (0) | 2020.07.18 |
---|---|
[C] 부분집합 여부 판단 (0) | 2020.07.17 |
[C] 사방의 값 채우기(지뢰찾기 변형) (0) | 2020.07.17 |
[C] 3X3 게임판의 Tic-Tac-Toe (0) | 2020.07.17 |
[C] 간단한 지뢰찾기(지뢰의 개수 출력) (0) | 2020.07.17 |