diff --git a/alloc.c b/alloc.c
index 82e21440359c1b256a988a41f1dd3f66a8d2806e..bb1e2278f6e4174a0adc02a7079dc8d80311d314 100644
--- a/alloc.c
+++ b/alloc.c
@@ -5,8 +5,6 @@ unsigned int n_link;
 unsigned int stacked_link;
 meta * meta_header[100];
 
-char Algorithm;
-
 void * m_malloc(size_t size)
 {
 	unsigned int new_size;
@@ -33,11 +31,11 @@ void * m_malloc(size_t size)
 	}
 	else
 	{
-		printf("dlrjakwsi?\n");
+//		printf("dlrjakwsi?\n");
 		return temp + 1;
 	}
 //	printf(" ")	;
-	return sbrk(size); // return address to pointer
+	return sbrk(new_size); // return address to pointer
 
 
 }
@@ -67,6 +65,7 @@ void * m_realloc(void *ptr , size_t size)
 	if(temp ->size == new_size)
 			return ptr;
 //***********************************************/	    
+/*
 	if(META.Tail == temp)
 	{
 		if(temp -> size > new_size)
@@ -76,7 +75,7 @@ void * m_realloc(void *ptr , size_t size)
 			return ptr;
 		}
 	}
-
+*/
 	if ( (int) temp -> size -(int) new_size >= 20)
 	{
 		split_block(temp, new_size); // split and add meta
@@ -136,8 +135,9 @@ void * re_allocate(void * ptr, meta * temp, size_t new_size )
 	unsigned int save_size;
 	save_size = temp -> size;
     save_temp = ptr;
-	m_free(ptr);
+//	m_free(ptr);
 	ptr = m_malloc( (size_t) new_size);
+	m_free(save_temp);
 	memmove(ptr, (void *)save_temp, save_size);
 	
 	return ptr;
@@ -223,7 +223,7 @@ void * m_free( void *ptr)
 	}
 	else if(temp -> next == NULL && temp -> prev == NULL)
 	{
-			printf("durldhsi??\n");
+//			printf("durldhsi??\n");
 			META.Head = NULL;
 			META.Tail = NULL;
 			brk(NULL);
@@ -265,54 +265,130 @@ void set_link(void)
 }
 meta * search_and_split(size_t size)
 {
-		
+	int max , min;
+	max = 0;
+	min = 0;
 	meta * temp = NULL;
 	temp = META.Head;
+	int temp_num = 0;
 	unsigned int diff;
 	unsigned int save;
+	int i = 0;
 	while(temp != NULL)
 	{
 		if(temp->free == 1 && temp->size >= size)
 		{
 			//	printf("nonono...\n");
 			diff = temp->size - size;
-				
+			if(Algorithm == 'F')
+			{	
 				if(diff >= 20)
-				{
-					save = temp;
-					meta_header[n_link] = save + 16  +(unsigned int)size;
-					meta_header[n_link] -> free = 1;
-
-					meta_header[n_link] -> next = temp -> next;
-					meta_header[n_link] -> next -> prev = meta_header[n_link];
-					temp -> next = meta_header[n_link];
-					meta_header[n_link] -> prev = temp;
-					
-					meta_header[n_link] -> size = temp -> size - size - 16;
-					temp ->free = 0;
-					temp ->size = size;
-					n_link++;
-					return temp;
-
+					return allocate(diff, size, temp);
+				else
+				{	
+					temp -> free = 0;
+//					temp -> size = size;
 
+					return temp;
 				}
-				else 
+			}	
+			else if(Algorithm == 'W')
+			{
+				if(temp -> size > max)
 				{
-//					printf("temp = %p\n",temp);
-					return temp;
-
+					max = temp ->size;
+					temp_num = i;
 				}
+			}
+			else if(Algorithm == 'B')
+			{
+				if(min == 0)
+					min = temp -> size;
 				
-			
+				if(min > temp -> size)
+				{
+					min = temp -> size;
+					printf("min : %d\n", min);
+					temp_num = i;
+				}
+			}
 			
 		}
 		temp = temp -> next;
+		i++;
+	}
+	if(Algorithm == 'W')
+	{
+		if(max == 0)
+			return NULL;
+		if(max != 0)
+		{
+			temp =  choose_meta(temp_num);
+			diff = temp -> size - size;
+			return allocate(diff , size , temp);
+		}
+			
+	}
+	else if(Algorithm  == 'B')
+	{
+//		printf("B\n");
+		if(min == 0)
+		{
+//			printf("???\n");
+			return NULL;
+		}
+		else if(min !=0)
+		{
+			temp = choose_meta(temp_num);
+			printf("temp_num : %d\n",temp_num);
+			diff = temp -> size - size;
+			return allocate(diff ,size ,temp);
+		}
 	}
 
 	return NULL;
 
 
 }
+
+meta * allocate(int diff, int size , meta *temp )
+{
+	meta * save = NULL;
+	save = temp;
+//	printf("B allocate\n");
+	if(diff >= 20)
+	{
+		save = temp;
+		meta_header[n_link] = save + 16  +(unsigned int)size;
+		meta_header[n_link] -> free = 1;
+		meta_header[n_link] -> next = temp -> next;
+		meta_header[n_link] -> next -> prev = meta_header[n_link];
+		temp -> next = meta_header[n_link];
+		meta_header[n_link] -> prev = temp;
+			
+		meta_header[n_link] -> size = temp -> size - size - 16;
+		temp ->free = 0;
+		temp ->size = size;
+		n_link++;
+		return temp;
+	}
+	else
+	{	
+		temp -> free = 0;
+		return temp;
+	}
+}
+meta * choose_meta(int num)
+{
+	meta * temp = NULL;
+	temp = META.Head;
+	for(int i = 0; i < num;i++)
+	{
+		temp = temp -> next;
+	}
+	return temp;
+}
+
 void print_link(void)
 {
 	meta * temp = NULL;
diff --git a/alloc.h b/alloc.h
index a1f30cde3957b707c95a19ada9941c1470a30bd1..742bd28da9959f3623864501f548b2da55b7c6a7 100644
--- a/alloc.h
+++ b/alloc.h
@@ -14,11 +14,16 @@ typedef struct meta_manage {
 meta * Head;
 meta * Tail;
 } manage;
+char Algorithm;
 
 manage META;
 
 void * m_malloc(size_t size);
 
+meta * choose_meta(int num);
+
+meta * allocate( int diff, int size ,meta * temp);
+
 void * m_realloc(void *ptr , size_t size);
 
 void * m_free (void * ptr);
diff --git a/main.c b/main.c
index b5fba0682b01a1005462aa24bf4ac2f21227e156..f4bb675ec98cb3a06875df9abaeb7373974aa012 100644
--- a/main.c
+++ b/main.c
@@ -1,6 +1,67 @@
 #include "alloc.h"
 
+
 int main()
 {
-  return 0;
+	int num;
+	char * str[100];
+	char move[4096]; // enough size;
+	meta * temp = NULL;
+	char * save = NULL;
+	char flag;
+	int size;
+	int sequence;
+	int n = 0;
+	int i= 0;
+	scanf("%d %c",&num, &Algorithm);
+
+	for(i=0; i < num; i++)
+	{
+//		printf("here?\n");
+		scanf(" %c",&flag);
+		if(flag == 'r')
+		{
+			scanf(" %d %d",&sequence , &size);
+			temp = choose_meta(sequence);
+			temp = m_realloc(temp + 1 , size);
+		}	
+		else if(flag == 's')
+		{
+		//	printf("asdf\n");
+			scanf(" %[^\n]",move);
+//			printf("size : %d\n", strlen(move));
+			str[n] = m_malloc(strlen(move) +1);
+			strcpy(str[n++], move);
+	//		printf("strlen : %d\n" ,strlen(str[n -1]));
+		}
+		else if(flag == 'f')
+		{
+			scanf(" %d",&sequence);
+//			printf("sequence = %d \n",sequence);
+			temp = choose_meta(sequence);
+			m_free(temp + 1);
+		}
+		else if(flag == 'e')
+		{
+			scanf(" %d",&size);
+			m_malloc(size);
+		}
+	}
+	temp = META.Head;
+	i=0;
+	printf("\n");
+	while(temp != NULL)
+	{
+	save = temp + 1;
+	printf("%d %d",temp ->free, temp->size);
+	if(temp -> free == 0)
+		printf(" %s\n", save);
+	else
+		printf("\n");
+	temp = temp ->next;
+	
+	}
+//	printf("\n");
+//	print_link();
+	return 0;
 }