ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

๋ฌธ์ œ1 : ๋‘ ๊ฐœ์˜ ์ง‘ํ•ฉ A์™€ B๋ฅผ ์ž…๋ ฅ ๋ฐ›์•„, A๊ฐ€ B์˜ ๋ถ€๋ถ„์ง‘ํ•ฉ์ธ์ง€๋ฅผ ๊ฒ€์‚ฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

 

์ž…๋ ฅ: ํ”„๋กœ๊ทธ๋žจ์€ ๋‘ ๊ฐœ์˜ ์ง‘ํ•ฉ A, B๋ฅผ ์ฐจ๋ก€๋กœ ํ‘œ์ค€์ž…๋ ฅ ๋ฐ›๋Š”๋‹ค.

์ถœ๋ ฅ: A B์ด๋ฉด 0์„ ์ถœ๋ ฅํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ง‘ํ•ฉ B์— ์†ํ•˜์ง€ ์•Š์€ ์ง‘ํ•ฉ A์˜ ๊ฐ€์žฅ ์ž‘์€ ์›์†Œ๋ฅผ ํ‘œ์ค€ ์ถœ๋ ฅํ•œ๋‹ค.

๋ชจ๋“  ์ง‘ํ•ฉ์€ ํ—ค๋” ๋…ธ๋“œ๊ฐ€ ์—†๋Š” ๋‹จ์ผ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ(singly-inked list) ํ˜•ํƒœ๋กœ ๊ตฌ์ถ•๋˜์–ด์•ผ ํ•œ๋‹ค.

 

์ž…๋ ฅ ์˜ˆ์‹œ 1

์ถœ๋ ฅ ์˜ˆ์‹œ 1

3 โ†ฆ ์ง‘ํ•ฉ A ํฌ๊ธฐ

4 6 13 โ†ฆ ์ง‘ํ•ฉ A

6 โ†ฆ ์ง‘ํ•ฉ B ํฌ๊ธฐ

1 3 4 6 8 13 โ†ฆ ์ง‘ํ•ฉ B

0 โ†ฆ A B

์ž…๋ ฅ ์˜ˆ์‹œ 2

์ถœ๋ ฅ ์˜ˆ์‹œ 2

3 โ†ฆ ์ง‘ํ•ฉ A ํฌ๊ธฐ

7 10 53 โ†ฆ ์ง‘ํ•ฉ A

4 โ†ฆ ์ง‘ํ•ฉ B ํฌ๊ธฐ

7 10 15 45 โ†ฆ ์ง‘ํ•ฉ B

53 โ†ฆ A B

 

์ฝ”๋“œ:

#include <stdio.h>
#include <stdlib.h>

typedef struct node {//๋‹จ์ผ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ ๋…ธ๋“œ
	int data;
	struct node* next;
}node;

void addset(node *set, int e){//  ์ง‘ํ•ฉ์— ์›์†Œ e์ถ”๊ฐ€
	node* newelem = (node*)malloc(sizeof(node));// ๋…ธ๋“œ ์ถ”๊ฐ€
	newelem->data = e;// ๋…ธ๋“œ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ฐ์ดํ„ฐ์— ์›์†Œ e๋ฅผ ๋„ฃ์–ด์คŒ
	newelem->next=NULL;// ๋‹ค์Œ ๋…ธ๋“œ์— NULL๊ฐ’ ๋„ฃ์–ด์ฃผ๊ธฐ

	while (set->next != NULL) {// ์ง‘ํ•ฉset ๋ ๋…ธ๋“œ๊นŒ์ง€ ๋ฐ˜๋ณต
		set = set->next;
	}
	set->next = newelem;// ์ œ์ผ ๋์— ์ƒˆ๋…ธ๋“œ ์ถ”๊ฐ€
}

int subset(node *A, node *B) {// ๋ถ€๋ถ„์ง‘ํ•ฉ์ธ์ง€ ๊ฒ€์‚ฌํ•˜๊ธฐ
	if (A == NULL)// ์ง‘ํ•ฉA๊ฐ€ ๊ณต์ง‘ํ•ฉ์ด๋ฉด 0๋ฆฌํ„ด(๊ณต์ง‘ํ•ฉ์€ ๋ชจ๋“ ์ง‘ํ•ฉ์˜ ๋ถ€๋ถ„์ง‘ํ•ฉ)
		return 0;
	else {// ๊ณต์ง‘ํ•ฉ์ด ์•„๋‹ˆ๋ฉด
		while (A != NULL) {// A๊ฐ€ NULL๊ฐ’์ด ๋‚˜์˜ฌ ๋•Œ๊นŒ์ง€
			if (B == NULL) {// B๊ฐ€ ๋น„์–ด์žˆ์œผ๋ฉด
				return A->data;// A์›์†Œ์ค‘ ๊ฐ€์žฅ ์ ์€ ์›์†Œ ์ถœ๋ ฅ
			}
			else if (A->data < B->data)// A์›์†Œ๊ฐ€ B์›์†Œ๋ณด๋‹ค ์ž‘์œผ๋ฉด ์ด๋ฏธ ๋ถ€๋ถ„์ง‘ํ•ฉ์ผ ์ˆ˜๊ฐ€ ์—†๋Š” ๊ฑฐ์ž„
				return A->data;// ๊ทธ๋Ÿผ  B์ง‘ํ•ฉ์— ํฌํ•จ๋˜์ง€ ์•Š๋Š” A์ง‘ํ•ฉ ์›์†Œ์ค‘ ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’ ์ถœ๋ ฅ
			else if (A->data > B->data)// A๊ฐ€ B๋ณด๋‹ค ํฌ๋ฉด B๋ฅผ ๋‹ค์Œ๋…ธ๋“œ๋กœ ๋„˜๊ฒจ
				B = B->next;
			else {// A์›์†Œ๋ž‘ B์›์†Œ๋ž‘ ๊ฐ™์œผ๋ฉด
				A = A->next;
				B = B->next;// ๋‘˜๋‹ค ํ•˜๋‚˜์”ฉ ๋‹ค์Œ๋…ธ๋“œ๋กœ ๋„˜๊ฒจ์ฃผ์‚ผ
			}
		}
		return 0;// ๋‹ค๋Œ๊ณ  ๋‹ค์˜ค๋ฉด ๋ถ€๋ถ„์ง‘ํ•ฉ์ธ ๊ฒƒ์ด๋ฏ€๋กœ 0์„ ๋ฐ˜ํ™˜ํ•ด์ค˜
	}
}

void freeset(node *set) {// ์ง‘ํ•ฉ ํ•ด์ œ~
	node* p = set;// ์ž„์˜์˜ ๋…ธ๋“œ p๋ฅผ ํ•˜๋‚˜์„ ์–ธํ•ด์„œ set์„ ๋„ฃ์–ด์ค˜

	while (p != NULL) {// p๊ฐ€ null๊ฐ’์ด ๋‚˜์˜ฌ ๋•Œ๊นŒ์ง€
		set = set->next;// set์€ ๋‹ค์Œ ๋…ธ๋“œ๋กœ ๋„˜๊ธฐ๊ณ 
		free(p);//p๋ฅผ ํ•ด์ œํ•ด์ค˜
		p = set;// ๋‹ค์Œ ๋…ธ๋“œ๋กœ ๋„˜์–ด๊ฐ„ set์„ p์— ๋„ฃ์–ด์ค˜
	}
}

int main() {
	int size, e;
	node* A = (node*)malloc(sizeof(node));
	node* B = (node*)malloc(sizeof(node));//์ง‘ํ•ฉ ๋…ธ๋“œ ์„ ์–ธ
	A->data = NULL;
	B->data = NULL;// ๋…ธ๋“œ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ฐ์ดํ„ฐ์— ๋„๊ฐ’ ๋„ฃ์–ด์ฃผ์‚ผ
	A->next = NULL;
	B->next = NULL;// ๋‹ค์Œ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ฌ ๋•Œ๋„ ๋„๊ฐ’ ๋„ฃ์–ด์ฃผ์‚ผ

	scanf("%d", &size);// A์ง‘ํ•ฉ ์‚ฌ์ด์ฆˆ ๋ฐ›๊ณ 
	for (int i = 0; i < size; i++) {
		(scanf("%d", &e));// ์›์†Œ๋„ ๋ฐ›๊ณ 
		addset(A, e);// ํ•จ์ˆ˜ ๋ถˆ๋Ÿฌ์„œ ์ง‘ํ•ฉ์— ์›์†Œ ์ถ”๊ฐ€
	}

	scanf("%d", &size);// B์ง‘ํ•ฉ ์‚ฌ์ด์ฆˆ ๋ฐ›๊ณ 
	for (int i = 0; i < size; i++) {
		(scanf("%d", &e));
		addset(B, e);// ํ•จ์ˆ˜ ๋ถˆ๋Ÿฌ์„œ ์ง‘ํ•ฉ์— ์›์†Œ ์ถ”๊ฐ€
	}
	printf("%d", subset(A, B));
	free(A);
	free(B);

	return 0;
}

 

 

๋ฌธ์ œ2: ๋‘ ๊ฐœ์˜ ์ง‘ํ•ฉ์„ ์ž…๋ ฅ๋ฐ›์•„, ํ•ฉ์ง‘ํ•ฉ๊ณผ ๊ต์ง‘ํ•ฉ์„ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

 

ํ”„๋กœ๊ทธ๋žจ์€ ๋‘ ๊ฐœ์˜ ์ง‘ํ•ฉ A, B๋ฅผ ์ฐจ๋ก€๋กœ ํ‘œ์ค€์ž…๋ ฅ ๋ฐ›๋Š”๋‹ค.

์ถœ๋ ฅ: ๊ฐ ์—ฐ์‚ฐ ๊ฒฐ๊ณผ๋Š” ๋‘ ๊ฐœ์˜ ๋ผ์ธ์œผ๋กœ ํ‘œ์ค€์ถœ๋ ฅํ•œ๋‹ค. ์ฒซ ๋ฒˆ์งธ ๋ผ์ธ์€ ํ•ฉ์ง‘ํ•ฉ์„, ๋‘ ๋ฒˆ์งธ ๋ผ์ธ์€ ๊ต์ง‘ํ•ฉ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. ์ด๋•Œ ๊ณต์ง‘ํ•ฉ์€ 0๋กœ ์ถœ๋ ฅํ•œ๋‹ค.

๋ชจ๋“  ์ง‘ํ•ฉ์€ ํ—ค๋”(header) ๋…ธ๋“œ๊ฐ€ ์ถ”๊ฐ€๋œ ๋‹จ์ผ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ ํ˜•ํƒœ๋กœ ๊ตฌ์ถ•๋˜์–ด์•ผ ํ•œ๋‹ค.

 

์ž…๋ ฅ ์˜ˆ์‹œ 1

์ถœ๋ ฅ ์˜ˆ์‹œ 1

6 โ†ฆ ์ง‘ํ•ฉ A ํฌ๊ธฐ

3 7 45 88 99 101 โ†ฆ ์ง‘ํ•ฉ A

4 โ†ฆ ์ง‘ํ•ฉ B ํฌ๊ธฐ

7 10 15 45 โ†ฆ ์ง‘ํ•ฉ B

โ–ก3 7 10 15 45 88 99 101 โ†ฆ ํ•ฉ์ง‘ํ•ฉ

โ–ก7 45 โ†ฆ ๊ต์ง‘ํ•ฉ

์ž…๋ ฅ ์˜ˆ์‹œ 3

์ถœ๋ ฅ ์˜ˆ์‹œ 3

0 โ†ฆ ์ง‘ํ•ฉ A ํฌ๊ธฐ (๊ณต์ง‘ํ•ฉ)

0 โ†ฆ ์ง‘ํ•ฉ B ํฌ๊ธฐ (๊ณต์ง‘ํ•ฉ)

โ–ก0 โ†ฆ ํ•ฉ์ง‘ํ•ฉ (๊ณต์ง‘ํ•ฉ)

โ–ก0 โ†ฆ ๊ต์ง‘ํ•ฉ (๊ณต์ง‘ํ•ฉ)

 

์ฝ”๋“œ:

#include <stdio.h>
#include<stdlib.h>

typedef struct node {// ๋…ธ๋“œ ๊ตฌ์กฐ์ฒด ์„ ์–ธ
	struct node* next;
	int data;
}node;

void addset(node* set, int elem) {// ์ง‘ํ•ฉset์— ์›์†Œelem ์ถ”๊ฐ€
	node* newnode = (node*)malloc(sizeof(node));// ์ƒˆ๋กœ์šด ๋…ธ๋“œ ํ• ๋‹น
	newnode->data = elem;
	newnode->next = NULL;// ์ดˆ๊ธฐํ™” ํ•ด์ฃผ๊ณ 

	while (set->next != NULL) {//์ง‘ํ•ฉ ๋์— ๋…ธ๋“œ์ถ”๊ฐ€
		set = set->next;
	}
	set->next = newnode;
}

struct node *_union(node* A, node *B) {// ํ•ฉ์ง‘ํ•ฉ ๊ตฌํ•˜๊ธฐ
	node* first = A;
	node* second = B;

	node* sumset = (node*)malloc(sizeof(node));// ํ•ฉ์ง‘ํ•ฉ ๋‹ด์„ ์ง‘ํ•ฉ๋…ธ๋“œ
	sumset->data = NULL;
	sumset->next = NULL;// ์ดˆ๊ธฐํ™” ํ•ด์ฃผ๊ณ 

	if ((first->next == NULL) && (second->next == NULL))// ๋‘˜๋‹ค ๊ณต์ง‘ํ•ฉ์ด๋ฉด
		return sumset;// ๊ทธ๋ƒฅ ๋นˆ ๋ฆฌ์ŠคํŠธ ๋ฐ˜ํ™˜
	else if (first->next == NULL) {// ์ฒซ๋ฒˆ์งธ์ง‘ํ•ฉ์ด ๊ณต์ง‘ํ•ฉ์ด๋ผ๋ฉด
		free(sumset);
		return second;// ๋‘๋ฒˆ์งธ์ง‘ํ•ฉ์ด ํ•ฉ์ง‘ํ•ฉ์ด ๋˜๋Š” ๊ฑฐ์ž„ ๋ฐ˜ํ™˜ใ„ฑ
	}
	else if (second->next == NULL) {// ๋‘๋ฒˆ์งธ์ง‘ํ•ฉ์ด ๊ณต์ง‘ํ•ฉ์ด๋ฉด
		free(sumset);
		return first;//์—‰ ์ฒซ๋ฒˆ์งธ์ง‘ํ•ฉ์ด ํ•ฉ์ง‘ํ•ฉ์ด ๋˜๋Š”๊ฒจ
	}
	else {
		first = first->next;
		second = second->next;// ๋‘˜๋‹ค ๊ณต์ง‘ํ•ฉ์ด ์•„๋‹ˆ๋ผ๋ฉด ๋‹ค์Œ ๋…ธ๋“œ๋กœ ์—ฐ๊ฒฐํ•ด์ฃผ๊ณ 

		while ((first != NULL) && (second != NULL)) {// ๊ฐ ์ง‘ํ•ฉ์˜ ๋๊นŒ์ง€ ๋Œ ๊ฒƒ์ž„
			if (first->data < second->data) {// ์ฒซ๋ฒˆ์งธ์ง‘ํ•ฉ ์›์†Œ๊ฐ€ ๋‘๋ฒˆ์งธ๋ณด๋‹ค ์ž‘์œผ๋ฉด
				addset(sumset, first->data);
				first = first->next;//์ฒซ๋ฒˆ์งธ๋ถ€ํ„ฐ ํ•ฉ์ง‘ํ•ฉ์ง‘ํ•ฉ์— ์ถ”๊ฐ€ํ•˜๊ณ 
			}
			else if (first->data > second->data) {//์•„๋‹ˆ๋ฉด ๋ฐ˜๋Œ€๋กœ ์ˆœ์„œ๋Œ€๋กœ ์ €์žฅํ•˜๋ ค๊ณ  ์ผ์ผ€ํ•˜๋Š”๊ฒจ
				addset(sumset, second->data);
				second = second->next;
			}
			else {//๊ฐ™์€ ์›์†Œ๊ฐ€ ์žˆ๋‹ค?
				addset(sumset, first->data);
				first = first->next;// ํ•œ๋ฒˆ๋งŒ ์ถ”๊ฐ€ํ•˜๋ฉด ๋จ
				second = second->next;
			}
		}
		while (first != NULL) {//๊ทผ๋ฐ์ด์ œ ์œ„์— ๋ฐ˜๋ณต๋ฌธ์„ ๋‹ค๋Œ๊ณ  ๋‚˜์™”๋Š”๋ฐ ์ฒซ๋ฒˆ์งธ์ง‘ํ•ฉ์— ๋‚จ์€ ์›์†Œ๊ฐ€ ์žˆ์–ด
			addset(sumset, first->data);
			first = first->next;// ๊ทธ๋Ÿผ ์ถ”๊ฐ€ํ•ด์ฃผ๋ฉด๋จ
		}
		while (second !=NULL) {// ์–˜๋„ ๋˜‘๊ฐ™์ด ใ„ฑใ„ฑ
			addset(sumset, second->data);
			second = second->next;
		}
	}
	return sumset;// ํ•ฉ์ง‘ํ•ฉ ๋ฐ˜ํ™˜
}

node* intersect(node* A, node* B) {// ์ด๊ฑฐ๋Š” ๊ต์ง‘ํ•ฉ
	node* first = A;
	node* second = B;
	node* intersect = (node*)malloc(sizeof(node));// ๊ต์ง‘ํ•ฉ ๋‹ด์„ ๋ฆฌ์ŠคํŠธ

	intersect->data = NULL;
	intersect->next = NULL;

	if ((first->next == NULL) && (second->next == NULL)) {//๋‘˜ ๋‹ค ๊ณต์ง‘ํ•ฉ์ด๋ฉด
		return intersect;// ๊ฑ ๋นˆ ๋ฆฌ์ŠคํŠธ ๋ฐ˜ํ™˜
    }
	else if (first->next == NULL) {// ์ฒซ๋ฒˆ์งธ๋งŒ ๊ณต์ง‘ํ•ฉ์ด์–ด๋„
		return intersect;// ๋นˆ๋ฆฌ์ŠคํŠธ ๋ฐ˜ํ™˜ ์™œ๋ƒ๋ฏ„ ๊ต์ง‘ํ•ฉ์ด๋‹ˆ๊ป˜
	}
    else if (second->next == NULL) {// ์–ด ์–˜๋„ ๋˜‘๊ฐ™์ด
		return intersect;
	}
	else {// ๋‘˜๋‹ค ๊ณต์ง‘ํ•ฉ์ด ์•„๋‹ˆ์•ผ
		first = first->next;
		second = second->next;

		while ((first != NULL) && (second != NULL)) {// ๋‘˜ ์ค‘ ํ•˜๋‚˜๊ฐ€ ๋๋‚˜๋ฉด ๋๋‚˜๋Š” ๋ฐ˜๋ณต๋ฌธ์ด์—ฌ
			if (first->data == second->data) {//์›์†Œ๊ฐ€ ๊ฐ™์œผ๋ฉด
				addset(intersect, first->data);// ๋‘˜ ์ค‘ ํ•˜๋‚˜๋งŒ ์ถ”๊ฐ€ํ•ด
				first = first->next;
				second = second->next;
			}
			else if (first->data < second->data)// ์›์†Œ๊ฐ€ ๋‹ค๋ฅด๋ฉด ์ ์€๊ฒƒ๋ถ€ํ„ฐ ์ˆœ์„œ๋Œ€๋กœ ์ถ”๊ฐ€
				first = first->next;
			else if (first->data > second->data)
				second = second->next;
		}
	}
	return intersect;
}

void print(node* set) {// ์ถœ๋ ฅ
	node* p = set->next;// ์ž„์‹œ๋กœ ๋…ธ๋“œ ํ•˜๋‚˜ ์„ ์–ธํ•˜๊ณ  ์ง‘ํ•ฉ ์—ฐ๊ฒฐ
	if (p == NULL)
		printf("0\n");// ๊ทธ๊ฒŒ ๊ทผ๋ฐ ๋นˆ์ง‘ํ•ฉ์ด์•ผ ๊ณต์ง‘ํ•ฉ, ๊ทธ๋Ÿฌ๋ฉด 0 ๋ฐ˜ํ™˜
	else {
		while (p != NULL) {// ๋๊นŒ์ง€
			printf(" %d", p->data);// ์ง‘ํ•ฉ ์›์†Œ ์ถœ๋ ฅ~!
			p = p->next;
		}
		printf("\n");
	}
}

void freeset(node* set) {// ๋ฉ”๋ชจ๋ฆฌ ํ•ด์ œ
	node* p = set;
	while (p != NULL) {
		set = set->next;
		free(p);
		p = set;
	}
}

int main() {
	int size, elem;
	node* A = (node*)malloc(sizeof(node));
	node* B = (node*)malloc(sizeof(node));// ์ง‘ํ•ฉ ํ• ๋‹น ๋จผ์ €ํ•ด์ฃผ๊ณ 
	node* sumset, * intersectset;//์–˜๋“ค์€ ๊ฐ๊ฐ ํ•ฉ์ง‘ํ•ฉ ๊ต์ง‘ํ•ฉ ๋ฐ›์„ ๊ฒƒ๋“ค
	A->data = NULL;
	A->next = NULL;
	B->data = NULL;
	B->next = NULL;// ์ดˆ๊ธฐํ™” ํ•ด์ฃผ๊ธฐ

	scanf("%d", &size);
	for (int i = 0; i < size; i++) {
		scanf("%d", &elem);
		addset(A, elem);// A์ง‘ํ•ฉ ์›์†Œ ๋ฐ›์•„์„œ ์ง‘ํ•ฉ์— ๋„ฃ๊ธฐ
	}
	scanf("%d", &size);
	for (int i = 0; i < size; i++) {
		scanf("%d", &elem);
		addset(B, elem);// B์ง‘ํ•ฉ ์›์†Œ ๋ฐ›์•„์„œ ์ง‘ํ•ฉ์— ๋„ฃ๊ธฐ
	}

	sumset = _union(A, B);// ํ•ฉ์ง‘ํ•ฉ ๊ตฌํ•˜๊ธฐ
	print(sumset);// ์ถœ๋ ฅ
	intersectset = intersect(A, B);// ๊ต์ง‘ํ•ฉ ๊ตฌํ•˜๊ธฐ
	print(intersectset);// ์ถœ๋ ฅ
	
	free(A);
	free(B);// ๋ฉ”๋ชจ๋ฆฌ ํ•ด์ œ
	free(sumset);
	free(intersectset);

}
๋ฐ˜์‘ํ˜•