diff --git a/alloc.c b/alloc.c
index 6ad21accebe541aa731bd404df0c660682d8d61b..cb737d6b54f9508873eb6ff5426db4d5f33c0193 100644
--- a/alloc.c
+++ b/alloc.c
@@ -3,9 +3,8 @@
 #include <stdlib.h>
 #include <stdbool.h>
 
-#define MSIZE sizeof(meta)-4
+#define MSIZE 16
 
-void* total = 0;
 void* base = 0;
 void* end = 0;
 void* cur = 0;
@@ -16,7 +15,7 @@ void *m_realloc(void* ptr, size_t size);
 void m_free(void* ptr);
 meta* search(void* ptr, size_t size);
 
-meta* search(void* ptr, size_t size){//current pointer
+meta *search(void* ptr, size_t size){//current pointer
   meta* index = base;
   meta* result = 0;
 
@@ -56,32 +55,41 @@ meta* search(void* ptr, size_t size){//current pointer
 
 void *m_malloc(size_t size){
   if(base == 0){
-    end = cur = total = base = sbrk(0); //sbrk 주소반환
+    end = cur = base = sbrk(0); //sbrk 주소반환
   }
-
+  
   if((size%4) != 0)
     size = (size/4+1)*4;
-  
-  meta* target = search(total, size); //find chunk
-
-  if(target == 0){
-    meta* new = total;
+// printf("m1\n"); 
+  meta* target = search(end, size); //find chunk
+//printf("m2\n");
+  if(target == 0 || (!target->next && target->size < size)){
+    meta* new = end;
     meta* now = cur;
-
-    sbrk(total + size + MSIZE);
-    now->next = new;
-    new->prev = now;
-    if(total = cur)
-      new->prev = 0;
+    //printf("m3\n");
+    sbrk(end+size+MSIZE);
+//    printf("m4\n");
     
+ //printf("m4.1\n");
+    if(end == cur)
+      new->prev = 0;
+    else{
+//	    printf("m4.2\n");
+      now->next = new;
+      new->prev = cur;
+    }
     new->next = 0;
     new->free = 0;
+   //  printf("m5\n");
     new->size = size;
+  //    printf("m5.1\n");
+   // if(target != -1) target->next = new;
     cur = new;
-
-    total = total + size + MSIZE;
+ //printf("m6\n");
+    end = end + size + MSIZE;
     return new->data;
   }else{
+	  //printf("m4\n");
     m_realloc(target->data, size);
   }
   return target->data;
@@ -91,51 +99,65 @@ void m_free(void* ptr){
   meta* target;
   target = ptr - MSIZE;
   target->free = 1;
-
-  if(target->prev != NULL){
+//printf("free error\n");
+  if(target->prev != -1){
     if(target->prev->free == 1){ //이전이 비어있으면 합침
       target->prev->size = target->prev->size + target->size + MSIZE;
       target->prev->next = target->next;
       target->next->prev = target->prev;
     }
-    if(target->next == NULL) //prev는 있지만 next가 없을때
+    if(!target->next) //prev는 있지만 next가 없을때
+      end = end - target->size + MSIZE;
       target->prev->next = NULL;
   }
-  if(target->next != NULL){ //next가 있을때
+  if(target->next != -1){ //next가 있을때
     if(target->next->free == 1){ //다음이 비어있으면 합침
       target->next->size = target->next->size + target->size + MSIZE;
       target->next->prev = target->prev;
       target->prev->next = target->next;
     }
   }
+  if(!target->next && !target->prev)//둘다 없을때
+    end = brk(base);
 }
 
 void* m_realloc(void* ptr, size_t size){
   meta* old = ptr - MSIZE; //meta 제외 사이
-  
+ // printf("re1\n");
   if(size%4 != 0){
     size = (size/4 + 1)*4; //4배수 맞추기
   }
-  
-  if(old->size == size) return ptr;
-  if(old->next != NULL){
+  // printf("re1-1, %d\n", old->size);
+  if(old->size == size){
+//printf("re1.2\n");
+    return ptr;
+  }
+// printf("re1.3\n");
+  if(old->next){
+//	  printf("re2\n");
     if(old->next->free == 1){
+//	    printf("re3\n");
       old->size = old->size + old->next->size + MSIZE;
       old->next = old->next->next;
       old->next->prev = old;
+  //    printf("re4\n");
     }
   }
   else if(old->size < size){
+//	  printf("re5\n");
     old->free = 1;
     meta* new = m_malloc(size);
-    memcpy(new, ptr, size);
+    strcpy(new, ptr);
+ //printf("re6\n");
     return new;
   }
   else if(old->size < size + MSIZE){
+// printf("re7\n");
     return ptr;
   }
   else{
-    meta* new = old + size + MSIZE;
+// printf("re8\n");
+    meta* new = (int)old + size + MSIZE;
     
     new->free = 1;
     new->next = old->next;
@@ -150,3 +172,14 @@ void* m_realloc(void* ptr, size_t size){
     return old->data;
   }
 }
+
+void print_all(){
+  meta* start = base;
+  while(start){
+    printf("%d %d ", start->free, start->size);
+    if(start->free != 1)
+      printf("%s", start->data);
+    printf("\n");
+    start = start->next;
+  }
+}
diff --git a/main.c b/main.c
index 890a3acd9ee724d06ae135739d01c373447ec792..3b12e691ec9c5b3f8e1ffa6c298091fe4b450d87 100644
--- a/main.c
+++ b/main.c
@@ -2,10 +2,97 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <stdint.h>
+#include <string.h>
 
 extern int fit;
+char *tok;
 
-int main()
+
+
+int main(int argc, char *argv[])
 {
+  if(argc != 2){ //인자 에러체크
+    printf("input error argc: %d\n", argc);
+    exit(1);
+  }
+
+  FILE *file;
+  char buffer[1024];
+  char *tok;
+  
+  if(!(file = fopen(argv[1], "r"))){//file open & error check
+    printf("file open error\n");
+    exit(1);
+  }fgets(buffer, sizeof(buffer), file);
+
+//  printf("11111\n");
+
+  tok = strtok(buffer, " ");
+  int buf_num = atoi(buffer); //숫자 문자열->정수형, 개수
+  if(!buf_num){
+    printf("buf error\n");
+    exit(1);
+  }
+
+  tok = strtok(NULL, " "); //FIT 0 1 2(first best worst)
+  if(tok[0] == 'F'){
+    fit = 0; //first
+  }
+  else if(tok[0] == 'B'){
+    fit = 1; //best
+  }
+  else if(tok[0] == 'W'){
+    fit = 2; //worst
+  }
+  else{
+    printf("fit type error\n");
+    exit(1);
+  }
+
+ // printf("2222\n");
+//-----------------------------------------------------------//
+  char **words = (char**)malloc(sizeof(char*)*buf_num);
+  int j = 0;
+  int length;
+  int index;
+  int num;
+  char* tmp;
+
+  for(int i = 0; i < buf_num; i++){//buf_num만큼 반복작업
+//	  printf("3333\n");
+    memset(buffer, " ", sizeof(buffer)); //memset
+    fgets(buffer, sizeof(buffer), file);
+  //  printf("4444\n");
+    if((tmp = strchr(buffer, '\n')) != NULL)
+	    *tmp = '\0';//문자열 맨뒤의 \n 제거
+
+    if(buffer[0] == 's'){//string
+//	    printf("s\n");
+      length = strlen(buffer+2);
+      words[j] = m_malloc(length+1);
+      strcpy(words[j++], buffer+2);
+    }
+    else if(buffer[0] == 'f'){//free
+      m_free(words[atoi(buffer+2)/*index*/]);
+    }
+    else if(buffer[0] == 'r'){//realloc
+	    printf("r\n");
+      tok = strtok(buffer+2, " ");//쪼개고
+      index = atoi(tok); //n번째
+      tok = strtok(NULL, " ");
+      length = atoi(tok); //m byte만큼 할당
+    //  printf("%d, %d\n", index, length);
+      m_realloc(buffer[index], length);
+    }
+    else if(buffer[0] == 'e'){//e = allocate mem sapce
+      buffer[j++] = m_malloc(atoi(buffer+2)/*index*/);
+    }else{//error check
+      printf("error!\n");
+      exit(1);
+    }
+  }
+//---------------------------------------------------------------//
+//printf("asdad\n");
+  print_all();
   return 0;
 }