Programming/์๋ฃ๊ตฌ์กฐ
[์งํฉ adt] ๋นํธ๋ฒกํฐ ์ฌ์ฉํด ๋ถ๋ถ์งํฉ ๊ฒ์ฌํ๊ธฐ, ํฉ์งํฉ, ๊ต์งํฉ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ ๋นํธ๋ฒกํฐ๋ก ์์ฑํ๊ธฐ
ํด๋์๊ทธ
2021. 4. 19. 20:52
๋ฐ์ํ
1. ๋นํธ๋ฒกํฐ ์ฌ์ฉํด ๋ถ๋ถ์งํฉ ๊ฒ์ฌํ๊ธฐ
์ฝ๋:
#include <stdio.h>
#include<string.h>
int subset(unsigned int A, unsigned int B) {// ์งํฉ A๊ฐ ์งํฉ B์ ๋ถ๋ถ์งํฉ์ธ์ง ๊ฒ์ฌ
if ((A | B) == B) // A or B๊ฐ B๋ผ๋ฉด A๋ B์ ๋ถ๋ถ์งํฉ์
return 1; // ๋ถ๋ถ์งํฉ์ด๋ฉด 1๋ฐํ
else
return 0; // ๋ถ๋ถ์งํฉ์ด ์๋๋ผ๋ฉด 0๋ฐํ
}
int main() {
char Aset[100], Bset[100]; // ์งํฉ Aset๊ณผ ์งํฉ Bset์ charํ์ผ๋ก ์ ์ธ
int lenA, lenB; // ๊ฐ ์งํฉ์ ๊ธธ์ด ์ ์ฅํ ๋ณ์
unsigned int A = 0, B = 0; // ์์๋ฅผ ๋ํ๋ผ ํ์ ์์ผ๋๊น unsigned ์๋ฃํ ์ฌ์ฉ
gets(Aset); //์งํฉ A์
๋ ฅ ๋ฐ๊ณ
lenA = strlen(Aset); // ๊ธธ์ด ๊ณ์ฐ
if (Aset[0] != '0') {// ๊ณต์งํฉ์ด ์๋๋ผ๋ฉด
for (int i = 0; i < lenA; i++) {
A = A | (1 << (Aset[i] - 'A'));// A์ ๋ฌธ์-'A'ํด์ค ๊ฐ์ left shiftํด์ค์ orํ๊ธฐ(๋นํธ๋ฒกํฐ๋ก ๋ฐ๊พธ๊ธฐ)
}
}
gets(Bset); //B๋ ๋๊ฐ์ด ๋ฐ๊ณ
lenB = strlen(Bset);
if (Bset[0] != '0') {
for (int i = 0; i < lenB; i++) {
B = B | (1 << (Bset[i] - 'A'));// ๋นํธ๋ฒกํฐ ๋ง๋ค์ด์ฃผ๊ธฐ
}
printf("%d\n", subset(A, B));// ํจ์ ํธ์ถํด์ ๋ถ๋ถ์งํฉ์ธ์ง ๊ฒ์ฌํ๊ณ ์ถ๋ ฅ
}
else
printf("1");// B๊ฐ ๊ณต์งํฉ์ด๋ผ๋ฉด ๋ถ๋ถ์งํฉ์ผ๋ก ๋ณด๊ณ ์ถ๋ ฅ(๊ทผ๋ฐ A๊ฐ ๋ถ๋ถ์งํฉ ์๋ ๋๋ ์๊ฐํด์ค์ผ๋๋๋ฐ ์๊ฐ์ํ๋ค ์ด์ ๋ณด๋๊น)
return 0;
}
**๋นํธ๋ฒกํฐ ์ด์ผํ๋์ง ๋ชฐ๋ผ์ ์กด๋ ํค๋งธ์........ ๋นํธ์ฐ์ฐ์ ๊ณต๋ถํ์
2. ํฉ์งํฉ, ๊ต์งํฉ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ ๋นํธ๋ฒกํฐ๋ก ์์ฑํ๊ธฐ
์ฝ๋:
#include <stdio.h>
#include<string.h>
void _union(int bit1[], int bit2[]) {
int arr[26];
int cnt1 = 0;
int cnt2 = 0;
for (int i = 0; i < 26; i++) {
if (bit1[i] != 0)
cnt1++;
}
for (int i = 0; i < 26; i++) {
if (bit2[i] != 0)
cnt2++;
}
if (cnt1 == 0 && cnt2 == 0) {
printf("0");
}
else {
for (int i = 0; i < 26; i++) {
if (bit1[i] == 1) {
arr[i] = 1;
}
if (bit2[i] == 1) {
arr[i] = 1;
}
}
for (int i = 0; i < 26; i++) {
if (arr[i] == 1) {
printf("%c", ('A' + i));
}
}
}
}
void intersect(int bit1[], int bit2[]) {
int arr[26];
int flag = 0;
int cnt1 = 0;
int cnt2 = 0;
for (int i = 0; i < 26; i++) {
if (bit1[i] != 0)
cnt1++;
}
for (int i = 0; i < 26; i++) {
if (bit2[i] != 0)
cnt2++;
}
if (cnt1 == 0 || cnt2 == 0) {
printf("0");
}
else {
for (int i = 0; i < 26; i++) {
if (bit1[i] == 1 && bit2[i] == 1) {
arr[i] = 1;
flag++;
}
}
if (flag == 0)
printf("0");
else {
for (int i = 0; i < 26; i++) {
if (arr[i] == 1) {
printf("%c", ('A' + i));
}
}
}
}
}
int main() {
char Aset[100], Bset[100];
int lenA, lenB;
int i = 0;
int bit1[26] = { 0 }, bit2[26] = { 0 };
gets(Aset);
lenA = strlen(Aset);
if (Aset[0] != '0') {
for (int i = 0; i < lenA; i++) {
bit1[Aset[i] - 'A'] = 1;
}
}
gets(Bset);
lenB = strlen(Bset);
if (Bset[0] != '0') {
for (int i = 0; i < lenB; i++) {
bit2[Bset[i] - 'A'] = 1;
}
}
_union(bit1, bit2);
printf("\n");
intersect(bit1, bit2);
return 0;
}
๋ฐ์ํ