Page 287 - Do it! 자료구조와 함께 배우는 알고리즘(C 언어, 3쇄)
P. 287
연습
문제 /* 집합 s1이 s2의 부분집합이면 1, 아니면 0을 반환 */
int IsSubset(const IntSet *s1, const IntSet *s2);
/* 집합 s1이 s2의 진부분집합이면 1, 아니면 0을 반환 */
int IsProperSubset(const IntSet *s1, const IntSet *s2);
Q2 배열 안의 원소가 항상 오름차순을 유지하는 집합 프로그램을 작성하세요. 원소의 검색은
이진 검색 알고리즘을 사용합니다(추가, 삭제도 마찬가지입니다). 또 오름차순을 유지한다는 특
징을 이용해 다른 배열과 같은지 확인하는 작업도 좀 더 효율적으로 진행해 보세요. 이때 집합을
관리하는 구조체의 이름은 SortedIntSet으로 하세요.
이렇게 프로그램을 만들면 다른 배열과 같은지 확인하는 작업도 효율적으로 할 수 있습니다. 하지만 원소를
삽입, 삭제하는 작업의 효율은 떨어집니다.
실습 7-3, 7-4는 앞에서 구현한 IntSet를 사용하는 프로그램입니다.
이 프로그램의 컴파일에는 IntSet.h, IntSet.c가 필요합니다.
실습 7-3 •완성 파일 chap07/IntSetTest1.c
01 /* int형 집합 IntSet의 사용 예(1) */ 실행 결과
02 #include <stdio.h>
s1 = { 10 15 20 25 }
03 #include "IntSet.h" s2 = { 10 15 12 25 }
04 s3 = { 10 15 12 25 }
05 int main (void) 집합 s1에 15가 들어 있습니다.
06 { 집합 s2에 25가 들어 있습니다.
07 IntSet s1, s2, s3; 집합 s1과 s2는 서로 같지 않습니다.
집합 s2와 s3은 서로 같습니다.
08 Initialize(&s1, 24);
09 Initialize(&s2, 24);
10 Initialize(&s3, 24);
11
12 Add(&s1, 10); /* s1 = {10} */
13 Add(&s1, 15); /* s1 = {10, 15} */
14 Add(&s1, 20); /* s1 = {10, 15, 20} */
15 Add(&s1, 25); /* s1 = {10, 15, 20, 25} */
16
17 Assign(&s2, &s1); /* s2 = {10, 15, 20, 25} */
18 Add(&s2, 12); /* s2 = {10, 15, 20, 25, 12} */
19 Remove(&s2, 20); /* s2 = {10, 15, 12, 25} */
20
07•집합 287