ํฐ์คํ ๋ฆฌ ๋ทฐ
[์งํฉ ADT] ๋ถ๋ถ์งํฉ์ธ์ง ๊ฒ์ฌํ๊ธฐ, ํฉ์งํฉ&๊ต์งํฉ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ
ํด๋์๊ทธ 2021. 4. 15. 03:33๋ฌธ์ 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);
}
- Total
- Today
- Yesterday
- SQL
- MYSQL
- AI์ปจํผ๋ฐ์ค
- ์ฝํ
- AIRUSH
- Aimers
- lgaimers
- ํ์ด์ฌ
- SKTECHSUMMIT
- ํ๋ก๊ทธ๋๋จธ์ค
- gan
- ์ฝ๋ฉ์๋ฌ
- ํ์ด์ฌ์ฝํ
- ๋ ผ๋ฌธ๋ฆฌ๋ทฐ
- ๊ธฐ์ ์ปจํผ๋ฐ์ค
- ๋ ผ๋ฌธ์ฝ๊ธฐ
- ๋๋ฆผ๋ถ์ค
- WGAN
- ๊ตฌ๊ธ์ฝ๋ฉ
- dreambooth
- ์คํ ์ด๋ธ๋ํจ์
- AIRUSH2023
- CLOVAX
- HyperCLOVA
- C์ธ์ด
- DALLE
- ์ฝ๋ฉ๊ณต๋ถ
- ํ ํฌ์๋ฐ
- ์ฝํ ์ค๋น
- StableDiffusion
์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
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 |