Posts Tagged ‘μˆ˜ν•™’

퀡 μ •λ ¬

μ΄λ²ˆμ—λŠ” 퀡 μ •λ ¬ μ•Œκ³ λ¦¬μ¦˜μ΄λ‹€

λ¬Όλ‘  μ—­μ‹œ μ΄μ‚°μˆ˜ν•™ 과제둜 λ‚˜μ˜¨ 녀석이닀

정렬은 λ­λ‹ˆλ­λ‹ˆν•΄λ„ κ°„λ§Œν•œ 버블정렬 λ§Œν•œκ²Œ μ—†λ‹€λŠ”..?!;;;;;

μž„μ€κΈ° κ΅μˆ˜λ‹˜μ΄ λ“€μœΌλ©΄ μ‹Έλ‹₯μ…˜ λ§žμ„ μ†Œλ¦¬λ₯Ό 덜덜;;

μžμ„Έν•œ μ†ŒμŠ€λŠ” λ°‘μ—μ„œ +_+γ…‹

[spoiler]

// μ΄μ‚°μˆ˜ν•™ ν€΅μ†ŒνŠΈ μ•Œκ³ λ¦¬μ¦˜ κ΅¬ν˜„
#include <stdio.h>


#define ELEMENT int // μž…λ ₯받을 μžλ£Œν˜•
#define MAX_LIST_SIZE 8 // μž…λ ₯ 받을 자료의 수


// ν•¨μˆ˜ ν”„λ‘œν†  νƒ€μž…
void quick_sort(ELEMENT list[], int left, int right); // 퀡정렬 ν•¨μˆ˜

int partition(ELEMENT list[], int left, int right); // 퀡정렬 ν•¨μˆ˜ μ•ˆμ—μ„œ ν”Όλ²—κΈ°μ€€ μ™Όμͺ½κ³Ό 였λ₯Έμͺ½μœΌλ‘œ λ‚˜λˆ„λŠ” ν•¨μˆ˜

void swap(int *row, int *high); // 값을 μ„œλ‘œ κ΅ν™˜ν•΄μ£ΌλŠ” ν•¨μˆ˜

void display_list(ELEMENT list[]); // 리슀트λ₯Ό 좜λ ₯ν•˜λŠ” ν•¨μˆ˜

// ν•¨μˆ˜ 본체
void display_list(ELEMENT list[])
{
int i;

for (i = 0; i < MAX_LIST_SIZE; i++) {
printf(”%d “, list[i]);
}
printf(”\n”);
}


void swap(int *row, int *high)
{
int temp;

temp = *row;
*row = *high;
*high = temp;
}


void quick_sort(ELEMENT list[], int left, int right)
{
int q; // νŒŒν‹°μ…˜ ν•¨μˆ˜μ—μ„œ λ°˜ν™˜λ˜λŠ” ν”Όλ²— 값을 μ €μž₯

if (left < right) { // leftκ°€ right 와 λ§Œλ‚ λ•ŒκΉŒμ§€ μ œκ·€ 호좜
q = partition(list, left, right); // partition ν•¨μˆ˜ ν˜ΈμΆœν•΄μ„œ ν”Όλ²—κΈ°μ€€μœΌλ‘œ 2개의 리슀트둜 λΆ„ν• 
quick_sort(list, left, q-1); // left κ°’μ—μ„œ ν”Όλ²— λ°”λ‘œ μ•ž κ°’κΉŒμ§€ 호좜
quick_sort(list, q+1, right); // 피봇 λ°”λ‘œ λ‹€μŒλΆ€ν„° rightκΉŒμ§€ 호좜
}
}


int partition(ELEMENT list[], int left, int right)
{
int pivot; // ν”Όλ²— 값을 μ €μž₯ν•  λ³€μˆ˜
int low, high; // low κ°’κ³Ό high 값을 μ €μž₯ν•  λ³€μˆ˜

low = left; // lowλŠ” μ™Όμͺ½μ—μ„œλΆ€ν„°
high = right + 1; // high λŠ” 였λ₯Έμͺ½λΆ€ν„°
pivot = list[left]; // 피벗은 리슀트의 κ°€μž₯ 처음 값을 κ°€μ§„λ‹€

do { // low와 highκ°€ λ§Œλ‚ λ•ŒκΉŒμ§€ λ°˜λ³΅ν•œλ‹€

do {
low++; // list[low]값이 피벗보닀 μž‘μœΌλ©΄ low 값을 계속 μ¦κ°€μ‹œν‚¨λ‹€
}

while (low <= right && list[low] < pivot);

do {
high–; // list[high]값이 피벗보닀 크면 high 값을 계속 κ°μ†Œμ‹œν‚¨λ‹€
}

while (high >= left && list[high] > pivot);

if (low < high) swap (&list[low], &list[high]); // lowκ°€ high 보닀 μž‘μ„λ•Œ list[low]κ°’κ³Ό list[high]값을 κ΅ν™˜ν•œλ‹€
display_list(list); // 쀑간과정 좜λ ₯
}

while (low < high);

swap(&list[left], &list[high]); // 피벗을 리슀트의 쀑앙에 μœ„μΉ˜μ‹œν‚¨λ‹€

return high; // ν”Όλ²—μ˜ μœ„μΉ˜λ₯Ό λ°˜ν™˜

}

void main ()
{
ELEMENT list[MAX_LIST_SIZE];

int i;


printf(”값을 μž…λ ₯ν•΄μ£Όμ„Έμš”\n”);

for (i = 0; i < MAX_LIST_SIZE; i++) {
printf(”%d 번째 κ°’ : “, i+1);
scanf(”%d”, &list[i]);
}

display_list(list); // μ‚¬μš©μžκ°€ μž…λ ₯ν•œ 리슀트λ₯Ό μš°μ„  좜λ ₯ν•œλ‹€.

quick_sort(list, 0, MAX_LIST_SIZE-1); // μž…λ ₯ν•œ 값을 μ •λ ¬

}

[/spoiler]

μ΅œμ†Œ λΉ„μš© μ‹ μž₯ 트리

μ΄λ²ˆμ— μ΄μ‚°μˆ˜ν•™ 과제둜 λ‚˜μ˜¨ μ΅œμ†Œ λΉ„μš© μ‹ μž₯ 트리……

κ·Έλž˜ν”„ μ•Œκ³ λ¦¬μ¦˜μ—μ„œ κ½€λ‚˜ 많이 μ“°μΈλ‹€λŠ”λ°……

(λ¬Όλ‘  λ‹€μ–‘ν•˜κ²Œ μ‘μš© κ°€λŠ₯?!)

이게 κ½€λ‚˜ 머리λ₯Ό 써야 λ§Œλ“œλŠ” μ•Œκ³ λ¦¬μ¦˜μ΄λΌμ„œ

일단 이해 ν•˜λ©΄μ„œ μ™Έμš°λŠ” λ°©ν–₯으둜 μ½”λ”©ν•˜μ˜€λ‹€.

μ—νœ΄ 이런 μ•Œκ³ λ¦¬μ¦˜μ„ λ“£μžλ§ˆμž λ°”λ‘œ 지수 μžˆλ‹€λ©΄ μ–Όλ§ˆλ‚˜ μ’‹μ„κΉŒ?

μ‹ μ΄μ‹œμ—¬ λ‚˜μ—κ²Œ 천재적 재λŠ₯을 제발;;;;;

μžμ„Έν•œ μ†ŒμŠ€λŠ” λ°‘μ—μ„œ 계속~

[spoiler]

#include <stdio.h>

#include <malloc.h>


typedef struct edge // 간선을 λ‚˜νƒ€λ‚΄λŠ” ꡬ쑰체

{

int vertex[2]; // μ‹œμž‘μ κ³Ό 끝점

int cost; // κ°€μ€‘μΉ˜

}Edge;

int **make_array(int n);// λ°°μ—΄ λ§Œλ“€κΈ°

void read_array(FILE *file, int *G[], int n);// νŒŒμΌμ—μ„œ λ°°μ—΄κ°’ 읽기

void convert_array_to_edge(int* G[], Edge E[], int n);// 배열을 κ°„μ„ μœΌλ‘œ λ³€ν™˜

void convert_edge_to_array(int* G[], Edge E[], int n, int m);// 간선을 λ°°μ—΄λ‘œ λ³€ν™˜

void print_edgy(Edge E[], int n);// κ°„μ„  μ§‘ν•© 좜λ ₯

void kruskal(int n, int m, Edge E[], Edge F[]);// 크루슀칼 μ•Œκ³ λ¦¬μ¦˜

void bubble_sort(Edge E[], int m);// κ±°ν’ˆ μ •λ ¬

void find_merge(int p, int q, int U[]);// 집합을 ν•©μΉ˜λŠ” ν•¨μˆ˜

int find_set(int i, int U[]);// ν•΄λ‹Ή 정점이 μ–΄λ–€ 집합에 μ†ν•˜λŠ”μ§€ μ°ΎλŠ” ν•¨μˆ˜

int main()

{

int n, m; // n개의 정점과 m개의 간선을 μ €μž₯ν•  λ³€μˆ˜

int **G; // 더블 ν¬μΈν„°λ‘œ 동적 배열을 생성할 λ³€μˆ˜ μ„ μ–Έ

int **result; // μ΅œμ†Œμ‹ μž₯ 트리λ₯Ό μΈμ ‘λ°°μ—΄λ‘œ λ‚˜νƒ€λ‚΄κΈ° μœ„ν•œ λ³€μˆ˜ μ„ μ–Έ


Edge *E, *F;

FILE* file;

file = fopen(”kruskal_array.txt”, “r”);

if(file == NULL) {

perror(”File open error”);

return 0;

}

fscanf(file, “%d %d”, &n, &m); // νŒŒμΌλ‘œλΆ€ν„° m, n을 μž…λ ₯ λ°›λŠ”λ‹€

E = (Edge *) malloc(sizeof(Edge)*(m-1)); // 처음 μž…λ ₯ 받은 배열을 κ°„μ„ μœΌλ‘œ μ €μž₯ν•˜κΈ° μœ„ν•œ Edge

F = (Edge *) malloc(sizeof(Edge)*(n-2)); // μ΅œμ†ŒλΉ„μš© μ‹ μž₯트리 κ²°κ³Όλ₯Ό μ €μž₯ν•  Edge

G = make_array(n); // λ°°μ—΄ λ§Œλ“€κΈ°

result = make_array(n);

read_array(file, G, n); // νŒŒμΌμ—μ„œ λ°°μ—΄ 정보 읽기

convert_array_to_edge(G, E, n); // λ°°μ—΄ 정보λ₯Ό κ°„μ„  μ •λ³΄λ‘œ λ³€ν™˜

printf(”\n## Kruskal μ΅œμ†Œ λΉ„μš© μ‹ μž₯ 트리 ##\n”); // 크루슀칼 μ•Œκ³ λ¦¬μ¦˜μ„ 돌린 μ΅œμ†Œ λΉ„μš© μ‹ μž₯ 트리λ₯Ό F κ°„μ„  집합에 μ‚½μž…

kruskal(n, m, E, F); // μ΅œμ†Œ λΉ„μš© μ‹ μž₯ 트리 κ²°κ³Ό 좜λ ₯

printf(”\nμ΅œμ†Œ λΉ„μš© μ‹ μž₯ 트리 κ²°κ³Ό\n”);

print_edgy(F, n);

printf(”\nμ΅œμ†Œ λΉ„μš© μ‹ μž₯ 트리 κ²°κ³Ό(인접 λ°°μ—΄)\n”);

convert_edge_to_array(result, F, n, m); // n-1개의 간선이 F에 ν¬ν•¨λ˜λ―€λ‘œ

fclose(file);

return 0;

}


void print_edgy(Edge E[], int n) // κ°„μ„  μ§‘ν•© 좜λ ₯

{

int i;

for(i = 0; i < n; i++) {

if(E[i].cost != 0)

printf(”v%d -> v%d, κ°€μ€‘μΉ˜ = %d\n”, E[i].vertex[0]+1, E[i].vertex[1]+1, E[i].cost);

}

}


int** make_array(int n) // N x N λ°°μ—΄ λ§Œλ“€κΈ°

{

int i, j;

int** array; // N x N 동적 배열을 할당받을 더블 포인터 λ³€μˆ˜λ₯Ό μ„ μ–Έ

n–;

array = (int**)malloc(sizeof(int*)*n);

for(i = 0; i <= n; i++) {

array[i] = (int*)malloc(sizeof(int)*n);

}


for (i = 0; i <= n; i++) {

for (j = 0; j <= n; j++) {

array[i][j] = 0;

}

}


return array; // array의 μ£Όμ†Œκ°’μ„ λ°˜ν™˜ν•΄μ€€λ‹€

}


void read_array(FILE *file, int *G[], int n) // νŒŒμΌμ—μ„œ λ°°μ—΄ 값을 읽어 λ°°μ—΄ G에 μ €μž₯

{

int i, j;

for(i = 0; i < n; i++) {

for(j = 0; j < n; j++) {

fscanf(file, “%d”, &G[i][j]);

}

}

}


void convert_array_to_edge(int *G[], Edge E[], int n)// λ°°μ—΄ 정보λ₯Ό κ°„μ„  μ •λ³΄λ‘œ λ³€ν™˜

{

int i, j, num = 0;

for(i = 0; i < n; i++) { // λ°°μ—΄μ˜ 정보λ₯Ό κ°„μ„  ꡬ쑰체에 μ‚½μž…

for(j = i; j < n; j++) {

if( G[i][j] != 0 && G[i][j] != 99 ) { // κ°€μ€‘μΉ˜μ˜ 값이 1μ—μ„œ 99 μ‚¬μ΄λ‘œ μ‘΄μž¬ν• λ•Œ

E[num].vertex[0] = i; // iλ₯Ό λ°°μ—΄ 첫번째 μš”μ†Œμ— λ„£λŠ”λ‹€(κ°„μ„ μ˜ μ‹œμž‘μ )

E[num].vertex[1] = j; // jλ₯Ό λ°°μ—΄ λ‘λ²ˆμ§Έ μš”μ†Œμ— λ„£λŠ”λ‹€(κ°„μ„ μ˜ 끝점)

E[num].cost = G[i][j]; // κ°€μ€‘μΉ˜λ₯Ό λ„£λŠ”λ‹€

num++; // E의 λ‹€μŒλ°°μ—΄μ„ μ¦κ°€μ‹œμΌœμ€€λ‹€

}

}

}

}


void convert_edge_to_array(int* G[], Edge F[], int n, int m)

{

int i, j;

int sum = 0;

int num = 0;

while (num < m) {

for (i = 0; i < n; i++) {

if (F[num].vertex[0] == i) {

for (j = 0; j < n; j++) {

if (F[num].vertex[1] == j) {

G[j][i] = F[num].cost;

G[i][j] = F[num].cost;

sum += F[num].cost;

continue;

}

}

}

}

num++;

}

for (i = 0; i < n; i++) {

for (j = 0; j < n; j++) {

printf(”%2d “, G[i][j]);

}

printf(”\n”);

}

printf(”μ΄λΉ„μš© : %d\n”, sum);

}

void kruskal(int n, int m, Edge E[], Edge F[]) // 크루슀칼 μ•Œκ³ λ¦¬μ¦˜

{

int start_vertex, end_vertax, i, current_edge;

int p, q; // μ„œλ‘œμ†Œ 체크λ₯Ό μœ„ν•œ 집합을 κ°€λ¦¬ν‚€λŠ” λ³€μˆ˜

int num = 0;

int* U = (int*)malloc(sizeof(int)*(n-1)); // μ§‘ν•© μ„ μ–Έ

Edge edge_temp;

printf(”\nμ •λ ¬ μ „ Edge E\n”);

print_edgy(E, m);

bubble_sort(E, m); // E에 μ†ν•œ m개의 간선을 κ°€μ€‘μΉ˜κ°€ μž‘μ€ 것뢀터 μ°¨λ‘€λ‘œ μ •λ ¬

printf(”\nμ •λ ¬ ν›„ Edge E\n”);

print_edgy(E, m);

for (i = 0; i < n; i++) {// μ§‘ν•© Initialize

U[i] = i;

}

current_edge = 0;

while(num < n-1) { // κ°„μ„ μ˜ μˆ˜κ°€ n-1보닀 μž‘μ„ λ™μ•ˆ

edge_temp = E[current_edge]; // 아직 κ³ λ €ν•˜μ§€ μ•Šμ€ κ°„μ„  쀑 κ°€μ€‘μΉ˜κ°€ μ΅œμ†ŒμΈ κ°„μ„ 

start_vertex = E[current_edge].vertex[0]; // i, j = e에 μ—°κ²°λœ 정점

end_vertax = E[current_edge].vertex[1];

p = find_set(start_vertex, U); // start_vertaxκ°€ μ†ν•˜λŠ” 집합을 p에 μ €μž₯

q = find_set(end_vertax, U); // end_vertaxκ°€ μ†ν•˜λŠ” 집합을 q에 μ €μž₯

if(p != q ) { // p와 q κ°€ μ„œλ‘œ μ†ν•œ 집합이 λ‹€λ₯΄λ‹€λ©΄

find_merge(p, q, U); // p, qκ°€ μ†ν•œ 집합을 ν•©μΉ¨

F[num] = edge_temp; // edge_tempλ₯Ό F에 μΆ”κ°€

num++;

}

current_edge++;

}

}

int find_set(int i, int U[]) // iκ°€ μ§‘ν•© U의 μ–΄λŠ 집합에 μ†ν•˜λ‚˜?

{

int j;

j = i;

while(U[j] != j) {

j = U[j];

}

return j;

}

void find_merge(int p, int q, int U[]) // p, qλ₯Ό μ§‘ν•© U에 ν•©μΉ©

{

if (p < q) { // pλŠ” ν•©λ³‘λœ 집합을 κ°€λ¦¬ν‚€λŠ” 포인터

U[q] = p; // qλŠ” 더 이상 집합을 κ°€λ¦¬ν‚€λŠ” 포인터가 μ•„λ‹˜

}

else {

U[p] = q;

}

}

void bubble_sort(Edge E[], int m) // E μ—£μ§€ μ§‘ν•©μ˜ κ°€μ€‘μΉ˜λ₯Ό μ •λ ¬ν•˜κΈ° μœ„ν•œ ν•¨μˆ˜

{

int i, Sorted = 0;

Edge tmp;

while( !S
orted ) {// 정렬이 μ™„λ£Œλ˜μ§€ μ•Šμ•˜μœΌλ©΄

Sorted = 1;

for(i = 1; i < m; i++) {

if( E[i-1].cost > E[i].cost ) {

tmp = E[i-1];

E[i-1] = E[i];

E[i] = tmp;

Sorted = 0;

}

}

}

}

[/spoiler]