diff --git a/README.md b/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..497175115c5e02e50d85b5d1597921cd0b117315
--- /dev/null
+++ b/README.md
@@ -0,0 +1,40 @@
+#This is For Final Assignment for 창의소프트웨어입문(F031-1)
+
+
+##magic_3x3.py
+##magic_4x4.py
+##magic_5x5.py
+##magix_nxn.py
+##multi_magix_4x4.py 로 구성되어있습니다.
+
+###
+magic_3x3.py에서는 사용자는 3x3 마방진을 만들 수 있습니다. 
+계산복잡도는 O(n^n)입니다.
+실행하고나면 9개의 숫자를 입력하라는 출력문구가 나오며, 숫자를 입력하면 그 숫자들로 만들 수 있는 마방진이 one2nine.txt 파일에 저장되고, stderr에 총 계산시간과, 몇개의 답을 찾았는지 출력하고 종료합니다.
+
+magic_4x4.py에서는 사용자는 4x4 마방진을 만들 수 있습니다. 
+계산복잡도는 O(n^n)입니다.
+실행하고나면 16개의 숫자를 입력하라는 출력문구가 나오며, 숫자를 입력하면 그 숫자들로 만들 수 있는 마방진이 4x4.txt 파일에 저장되고, stderr에 총 계산시간과, 몇개의 답을 찾았는지 출력하고 종료합니다.
+부가적으로 사분면의 계산을 위한 함수외에 실제 마방진(사분면에 대한 계산 없이 마방진을 만듦)을 만들긴 했다만, 사분면마방진에 포함되는 내용이라 따로 출력양식을 만들어놓지 않았습니다.
+만약 1~16까지의 입력을 한다면 예상 출력답은 3456개이며, 계산시간은 제 컴퓨터 기준 66.91초 입니다.
+
+magic_5x5.py
+숫자가 늘어남에따라 기하급수적으로 증가하므로 기존의 방법으로는 너무 오랜시간이 들었습니다. 
+그리하여 만약 input이 연속된 숫자이고, 중복이 존재하지않는 경우를 가정하고 만들었던 5*5마방진입니다.
+4x4마방진으로 바뀌기 전에 이미 작성하였는데 삭제하기 아까워서 함께 제출합니다.
+만약 연속된 25개의 숫자로 만들 수 있는 마방진은 과연 몇개가 있을까 고민해보았습니다. 
+그 결과 하나를 만들어놓고 90도회전 4번, 원점대칭 1번으로 8개를 만드는것이 가장 쉬웠기에 
+일단은 8개를 만들어놓고 더 만들떄의 케이스를 생각중이었습니다.
+
+
+magix_nxn.py
+실패입니다.
+
+multi_magix_4x4.py
+파이썬은 단일 쓰레드를 사용합니다. 만약 멀티프로세싱을 이용하면 연산속도가 얼마나 빨라질 수 있을까 고민하며 만들어보려합니다. 아직 미완성입니다.
+
+test_nxn.py
+magic_3x3.py와 magic_4x4.py 의 결과 text파일을 이용합니다.
+먼저 두개의 파이썬을 실행 완료한 후, 어떤것을 테스트할지 입력합니다.
+1을 입력하면 magic_3x3.py의 결과를 테스트합니다.
+2를 입력하면 magic_4x4.py의 결과를 테스트합니다.
\ No newline at end of file
diff --git a/magic_4x4.py b/magic_4x4.py
index 72aa1a23dff8c7f9f0e05a21cab2c2c1cce041c6..2f53b75cd8af5398e3fd2cb237004a44d396295f 100644
--- a/magic_4x4.py
+++ b/magic_4x4.py
@@ -14,7 +14,7 @@ import sys , copy
 
 
 startTime = time.time()
-print("Typing Your Number split by space '중복숫자는 불가합니다':   < ex : 1 2 3 4 5 6 7 8 9 10 11 ... 15>")
+print("Typing Your Number split by space :   < ex : 1 2 3 4 5 6 7 8 9 10 11 ... 15>")
 str=input()
 try:#스페이스로 구분해서 입력한경우
     arr1=[int(a) for a in str.split()]
diff --git a/multi_magix_4x4.py b/multi_magix_4x4.py
new file mode 100644
index 0000000000000000000000000000000000000000..a32731259d541ab17e1c2a2d55d5451c2ab3b773
--- /dev/null
+++ b/multi_magix_4x4.py
@@ -0,0 +1,139 @@
+'''
+201320527 교통시스템공학과 장형준
+4x4  마방진 - magix_4x4.py (가로/세로/대각선과 1사분면, 2사분면, 3사분면, 4사분면의 합이 모두 같음, 입력된 숫자는 한번 만 사용,
+만일 중복된 숫자가 있으면 중복된 횟수만큼 사용)
+입력숫자를 input 명령으로 사용자가 자유롭게 입력할 수 있도록 한다.
+예)  1 2 3 4 5 6 7 8 9 10 10 11 13 14 14 15
+출력은 각각의 답을 한줄로 stdout으로 다음과 같이 모두 출력한다.
+예) 1 14 14 4 11 7 6 9 8 10 10 5 13 2 3 15
+stderr에 다음 예와 같이 출력한다.
+총 XX 개의 답이 있습니다. 계산시간은 총 Y.YYYY 초 입니다.'''
+
+import time , math
+import sys , copy
+import multiprocessing
+
+startTime = time.time()
+print("Typing Your Number split by space '중복숫자는 불가합니다':   < ex : 1 2 3 4 5 6 7 8 9 10 11 ... 15>")
+str=input()
+try:#스페이스로 구분해서 입력한경우
+    arr1=[int(a) for a in str.split()]
+except ValueError: # , 컴마로 구분해서 입력한경우
+    arr1=[int(a) for a in str.split(',')]
+finally:
+    arr1.sort()
+    num=int(math.sqrt(len(arr1)))
+    table=[[0]*num for i in range(num)]#n차 테이블
+
+def newlistremove(src,a): #list를 받아서, 요소 a 를 삭제한 새 리스트를 반환하는 함수
+    new_list=copy.copy(src)
+    new_list.remove(a)
+    return new_list
+
+
+# 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
+def mkQuadrantTable(arr1): # 사분면기준 마방진 만들기
+    match = 0
+    avg = sum(arr1) / 4
+    for a in arr1:
+        blist = newlistremove(arr1, a)
+        for b in blist:
+            clist = newlistremove(blist, b)
+            for c in clist:
+                dlist = newlistremove(clist, c)
+                for d in dlist:
+                    if (a + b + c + d != avg): continue #1번째 줄 검사
+                    elist = newlistremove(dlist, d)
+                    for e in elist:
+                        flist = newlistremove(elist, e)
+                        for f in flist:
+                            if(a+b+e+f != avg):continue #1사분면검사
+                            glist = newlistremove(flist, f)
+                            for g in glist:
+                                hlist = newlistremove(glist, g)
+                                for h in hlist:
+                                    if(c+d+g+h != avg or e+f+g+h != avg) : continue
+                                    ilist = newlistremove(hlist, h)
+                                    for i in ilist:
+                                        jlist = newlistremove(ilist, i)
+                                        for j in jlist:
+                                            klist = newlistremove(jlist, j)
+                                            for k in klist:
+                                                llist = newlistremove(klist, k)
+                                                for l in llist:
+                                                    if (i + j + k + l != avg): continue
+                                                    mlist = newlistremove(llist, l)
+                                                    for m in mlist:
+                                                        if (d+g+j+m !=avg or a + e + i + m != avg): continue
+                                                        nlist = newlistremove(mlist, m)
+                                                        for n in nlist:
+                                                            if (b+f+j+n !=avg or i+j+m+n != avg): continue
+                                                            olist = newlistremove(nlist, n)
+                                                            for o in olist:
+                                                                if (c + g + k + o != avg): continue
+                                                                plist = newlistremove(olist, o)
+                                                                for p in plist:
+                                                                    if (a+f+k+p!= avg or m+n+o+p!=avg or d+h+l+p!=avg or k+l+o+p!=avg): continue
+                                                                    print(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o,
+                                                                          p)
+                                                                    match += 1
+    return match
+
+def mkMagicTable(arr1):# 일반적인 마방진형식
+    match=0
+    avg = sum(arr1) / 4
+    for a in arr1:
+        blist=newlistremove(arr1,a)
+        for b in blist:
+            clist=newlistremove(blist,b)
+            for c in clist:
+                dlist=newlistremove(clist,c)
+                for d in dlist:
+                    if(a+b+c+d != avg):continue
+                    elist=newlistremove(dlist,d)
+                    for e in elist:
+                        flist=newlistremove(elist,e)
+                        for f in flist:
+                            glist=newlistremove(flist,f)
+                            for g in glist:
+                                if(a+e+f+g != avg) : continue
+                                hlist=newlistremove(glist,g)
+                                for h in hlist:
+                                    ilist=newlistremove(hlist,h)
+                                    for i in ilist:
+                                        if(d+g+i+h != avg): continue
+                                        jlist=newlistremove(ilist,i)
+                                        for j in jlist:
+                                            klist=newlistremove(jlist,j)
+                                            for k in klist:
+                                                llist=newlistremove(klist,k)
+                                                for l in llist:
+                                                    if(a+j+k+l != avg):continue
+                                                    mlist=newlistremove(llist,l)
+                                                    for m in mlist:
+                                                        if (e+j+i+m !=avg):continue
+                                                        nlist=newlistremove(mlist,m)
+                                                        for n in nlist:
+                                                            if(f+h+k+n != avg) : continue
+                                                            if(d+m+n+l != avg) : continue
+                                                            olist=newlistremove(nlist,n)
+                                                            for o in olist:
+                                                                if (b+j+h+o!=avg):continue
+                                                                plist=newlistremove(olist,o)
+                                                                for p in plist:
+                                                                    if(c+i+k+p!=avg):continue
+                                                                    if(g+o+p+l !=avg) : continue
+                                                                    print(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p)
+                                                                    match+=1
+                                                                    return match
+
+# 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
+sys.stdout = open("4x4.txt",'w')
+#pool=multiprocessing.Pool(processes=2) #멀티프로세싱 연습
+#pool.map(mkQuadrantTable,arr1)
+count=mkQuadrantTable(arr1)
+t=round(time.time() - startTime , 2) #수행시간을 출력
+sys.stderr.write("총 {} 개의 답이 있습니다. 계산시간은 총 {} 초 입니다.".format(count, t))
+
+
+