마방진

2020. 9. 12. 12:49책 · 펌글 · 자료/생활·환경·음식

 

 

 

 

마방진 [魔方陣]이란

- 여러 개의 자연수(중복되지 않은 수)를 정사각형 모양으로 나열하

가로나 세로나 대각선으로나 그 합이 모두 같게 한 것.

 

-반도체 칩에 활용되는 마방진 원리

-우리 나라 최초 개발자 : 조선 수학자 최석정(1646-1715)

 

 

 마방진 만드는 원리

 

1차 마방진

N

 

2차 마방진

N

X

Y

Z

 

X=Y=Z 이고 N=Y이므로 N=X=Y=Z가 된다.

그러나 이는 숫자가 중복되면 안된다는 마방진의 정의에 부합되지 않으므로 2차 마방진은 존재하지 않는다.

 

 

3차 마방진

 

 

마방진 숫자 비밀 유래는?

 

마방진에 대한 유래는 전설로 전해지는 중국 하나라의 우 임금 때로 거슬러 올라가는데요.

우 임금은 매년 범람하는 황하의 물길을 정비하던 중에 이상한 그림이 새겨진 거북의 등껍데기를 발견하였는데,

낙서라고 불리는 이 그림에는 1부터 9까지의 숫자가 가로, 세로 세 줄씩 배열되어 있었다고 합니다.

 

4차 마방진 : 가로 세로 4개의 정사각형(16)

5차 마방빈 : 가로 세로 5개의 정사각형(25)

9차 마방진 : 가로 세로 9개의 정사각형(81)

 

 

 마방진 문제 풀이

 

-홀수 마방진 푸는 법

 

빈칸이 9개 있는 정사각형을 만들고(그림 A),

왼쪽 위에서 오른쪽 아래로 비스듬히 1, 2, 3, 9까지의 숫자를 그림B와 같이 쓰고,

정사각형의 바깥쪽에 있는 각 숫자를 그 줄에서 가장 먼 자리에 있는 칸으로 옮겨쓴다.

, 19 바로 위에, 37옆에 그리고 9 5 위에 오도록 한다

 

 

 

 

4×4 형은 가로, 세로 4줄로 된 칸을 만들고 그림처럼 대각선 2개를 긋는다.

그리고 각 칸마다 A, B, C와 같이 이름을 붙인다.

먼저, 1A칸에 둔다.

그러나 대각선이 있기 때문에 쓰지 않고 그대로 둔 채

2를 다음 B칸에, 3C칸에 써 넣는다.

6, 7F, G칸에 들어가야 하지만 대각선이 있기 때문에 그만 두고,

H8을 넣고, I9를 넣는다.

J, K에는 10, 11이 들고, N, O14, 15를 넣는다.

 

다음은 대각선상에 있는 칸을 메워 간다.

P1A16을 둔다.

이어서 왼쪽에서 오른쪽으로 15, 14, 13 과 같이 거꾸로 D13

F, G, J, K, M에 각각 11, 10, 7, 6, 4를 채우면

4×4 형의 마방진은 완성된다.

 

 

1. 정사각형의 맨 아랫줄 가운데에 숫자 1 을 둔다.

 

 

2. 이전 숫자 위치에서 오른쪽 아래칸이 비어 있으면 다음 숫자를 채운다.

 

 

 

3. 숫자 2 에서 오른쪽 아래의 칸을 찾는다.
위의 경우처럼 수평 및 수직으로 이동할 수 있는지 확인한다.
아래 그림의 경우 수평으로 이동이 가능하므로 맨 마지막 칸에
다음 숫자인 3 을 채운다.

 

 

4. 숫자 3의 위치에서 오른쪽 아래의 칸을 보면 이미 숫자가 채워져 있으므로,
이전 숫자의 위에 다음 숫자인 4 를 채운다.

 

 

5. 숫자 4 에서 오른쪽 아래칸을 보면 칸이 비어 있으므로 다음 숫자인 5 를 채운다.

 

 

6. 이전처럼 숫자 5 에서 오른쪽 아래칸이 비어 있으므로 숫자 6 을 채운다.

 

 

7. 숫자 6 에서 오른쪽 아래칸을 보면 가로 및 세로로 이동할 수 있는 칸이

아니므로, 이전 숫자의 위칸에 다음 숫자인 7 을 채운다.

 

 

8. 숫자 7 에서 오른쪽 아래칸이 사각형 영역 밖이므로 수평 및 수직으로 이동한다.
다음의 예는 수평으로 이동이 가능하므로 마지막 칸에 숫자 8 을 채운다.

 

 

9. 숫자 8 에서 오른쪽 아래칸이 사각형 영역 밖이므로 수평 및 수직으로
이동해 본다. 다음의 경우 수직으로 이동이 가능하므로, 다음 숫자인 9 를 채운다.

 

 

오늘날의 국무총리 격인 영의정까지 지낸 최석정(崔錫鼎, 1646~1715)은 아주 체계적인 수학책으로 유명한 저서 '구수략(九數略)'에서 세계 최초로 9차 마방진을 만들었습니다.마방진이란 가로 세로 9칸씩 81개의 칸에 숫자를 1에서 81까지 하나씩 넣었을 때 가로와 세로, 대각선 어느 방향으로 더해도 합이 같도록 이룬 배열을 말합니다.

 

 

최석정의 9차 마방진입니다. 어느 방향으로 더해도 합이 369가 나옵니다.어떤 방법을 이용해 이런 신기한 마방진을 만들었는지는 아직까지 알려지지 않고 있습니다.세계적인 수학자인 오일러의 발견보다 60년 이상 빠른 발견입니다.

 

 

다음검색

저작자 표시 컨텐츠변경 비영리

 

 

 

 

 

 

 

 

 

 

마방진(魔方陣)

 

정사각형 모양의 줄을 지어 늘어선 칸에 자연수를 배열하여 가로· 세로· 대각선으로 합친 수가 모두 같도록 만든 것을 방진(方陣)이라 하며, 이는 마치 마술처럼 신기하게 느껴지기도 한다. 이는 균형과 조화의 원리이다. 균형 잡히게 구도를 잡는 원칙이며 서로 다른 경우들을 중복되지 않게 배치하는 수학의 원리이다.

 

 

3차 마방진의 원리는 3*3으로 9개의 방에 자연수 1부터 9까지 사용하여 중복되지 않게 숫자를 배열한다. 가로와 세로, 대각선의 수를 합하면 15가 된다. 가로 4+9+2=15, 3+5+7=15, 8+1+6=15이며, 세로 4+3+8=15, 9+5+1=15, 2+7+6=15, 대각선 4+5+6=15, 8+5+2=15이다. 15는 여러 개의 경우로 만들 수 있음을 알 수 있다.

 

 

 

김홍도의 대표적인 작품이 [씨름]이다. 이 그림을 자세히 살펴보면 X자형의 방진임을 알 수 있다. 그림의 중앙에 두 사람이 씨름을 하는 장면이고 좌우 대각선 사람의 수를 헤면 8+2+2 와 5+2+5로 12사람으로 배치하여, 전체 그림의 구도가 균형 있게 잡혀 있다. 그리고 그림의 오른쪽 하단의 두 사람이 있는데 한 사람의 손의 모양이 오른쪽과 왼쪽으로 잘못 그려져 있는 것을 발견할 수 있다. 이는 작가가 의도적으로 그렇게 그린 것으로 일종의 변종이라는 생각이 든다.

 

 

 

 

스페인의 가우디 작품인 성 가족 성당 안에도 마방진을 찾아볼 수 있다. 그곳에는 4차 4*4의 마방진으로 1부터 16까지 수의 배열인데 16은 빠져 있고 14와 10은 중복으로 되어 있다. 그런데 가로· 세로· 대각선의 합은 34가 되어야 하는데 여기는 33이다. 그러기 위해서 16은 빼고 10과 14는 중복으로 배열하였다. 이렇게 33이 되도록 한 것은 예수님의 생애를 방진으로 표현한 상징이라 할 수 있다.
자연계에서도 균형과 조화의 원리(방진)가 성립한다. 같은 것이지만 DNA의 모양이나 구조를 달리하여 다른 것을 만들어 균형과 조화를 이루고 있다. 사람의 경우도 같은 종이지만, 왼손잡이가 있는가 하면 오른손잡이가 있고 조합과 배열에 따라 수많은 사람이 존재하게 된다. 식물의 경우도 같은 종의 식물이지만 줄기가 오른쪽으로 휘감아 올라가는 식물이 있는가 하면 왼쪽으로 감아 뻗어가는 것도 있다.
물질의 세계도 같은 개체이지만 입체적 배열이나 구조가 달라 물리적 화학적 성질을 달리 하고 있는 물질(이성체)이 수없이 많으며, 그 대표적인 것이 의약품이다. 진통제만 하더라도 그 종류가 수없이 많으며 고혈압 치료에도 쓰이는 약이 여러 가지이다. 지금 신종 바이러스가 그런 것이 아닌가 싶다. 같은 바이러스인데 그것이 구조나 배열의 변이로 ‘메르스’나 ‘사스’, ‘코로나’와 같은 변종의 바이러스가 생기지 않을까. 바이러스가 변종이 생기듯 그 치료약도 기존의 물질에 구조나 배열을 달리해 쉽게 만들어낼 수 있지 않을까 싶다.
수의 배열을 달리하여 여러 종류의 경우의 수를 만들어내듯 물질의 세계도 그렇게 해서 새로운 미생물이 생기고 이것이 몸에 들어와 질병을 일으킨다. 거기에 따른 대체 의약품도 어렵지 않게 만들어지리라. 그러니까 시일이 걸리기는 하지만 어떤 병이든 퇴치할 수 있는 것이라 너무 두려워하지 말고 일상의 삶을 누려야 하리라.

 

 

 

 

 

 

 

 

 

 

 

1. 마방진의 원리

마방진은 n * n의 개의 숫자를 n * n 행렬에 배열한 것인데,

가로, 세로, 대각선의 합이 모두 같다는 특징을 가지고 있습니다.

 

n이 2가 아니면 마방진은 항상 존재하구요.

 

간단한 예로 5 * 5 마방진은 이렇게 생겼어요.

1부터 n * n까지 모두 채워져 있는데, 아직까진 배열이 어떻게 채워졌는지 감이 오지 않습니다.

하지만 여기에도 규칙이 있으니, 그것은 1이 반드시 첫 번째 행 중간에 와야한다는 점이에요.

그리고 숫자들을 오름차순으로 하나둘씩 채워나갑니다.

 

다음 숫자는 바로 전 숫자의 윗 행, 다음 열에 채우는데요.

다시 말해, 행의 인덱스를 'i'라고 하고, 열의 인덱스를 'j'라고 했을 때,

다음 숫자의 위치는 (i-1)(j+1)이 된다는 말이에요.

 

그런데 1 다음 숫자인 2를 채우려고 하는데, 처음부터 난관인지 자리가 없네요...

 

그럴 때는 열의 인덱스(=j)만 1증가시키고, 행의 인덱스(=i)는 과감하게 n으로 보내줍니다.

 

 

그리고 3까지는 문제 없이 잘 되었습니다.

 

행은 잘 해결되나 싶었는데, 이제는 열이 문제네요.

하지만 열도 별반 다르지 않습니다.

보낼 자리가 없으면 과감히 윗 행( i + 1), 처음 열( j = 0)로 보내면 됩니다.

 

그리고 5까지는 문제 없지 잘 되는가 싶었는데, 이제는 6이 들어갈 자리에 1이 이미 들어가있네요.

 

 

이럴 때는 살포시 바로 아래로 내려주시면 됩니다. ( i - 1)(j)

 

이런 원리로 채워나가니, 다음과 같이 마방진이 완성되었습니다.

 

2. 마방진 C++로 구현하기

역시나 시간을 많이 잡아먹는 마방진, 이제는 컴퓨터가 스스로 할 수 있도록 C++ 구현해볼께요!

먼저 간단하게 5 * 5 정적 할당으로!

2-1. 정적 할당으로 구현

5 * 5의 2차원 배열을 선언했습니다.

 

그 다음으로 필요한 변수들을 선언하고, 초기화 하겠습니다.

여기서 'i'는 시작 행 인덱스, 'j'는 시작 열 인덱스, k는 1부터 채워나갈 숫자,

nmg는 '나머지'를 표현한 것인데, 이를 선언한 이유는 조금 이따가 알려드릴께요!

 

그리고 반복문을 돌려 배열을 하나둘 씩 채워주도록 하겠습니다.

k는 5 * 5의 배열이므로 25까지 반복해주고, magicNumber[0][2]에는 1을 넣어줍니다.

 

그럼 여기까지 하나 공식처럼 뽑아낼 수 있는 것이 있습니다.

숫자는 1부터 n * n까지 반복되어야 하며,

시작행 인덱스는 무조건 0, 시작열 인덱스는 n / 2가 됩니다.

 

그리고 이제는 '나머지(nmg)'라는 변수를 사용할 차례인데요.

나머지는 말 그대로, 나머지를 구해 저장하는 변수입니다.

나머지는 숫자 변수인 k를 5로 나누어준 나머지를 기억합니다.

 

그 이유는 신기하게도 '숫자 ÷ 마방진의 크기'의 나머지가 0이 될 때마다 숫자를 채우는 방식이 아래 방향이 되요. 한 번 보실까요?

 

그래서 당연히 후속 제어문도 다음과 같이 작성할 수 있겠습니다.

당연히 열 변수인 j는 건들 필요가 없습니다.

 

이제는 k가 5로 나누어 떨어지지 않을 경우를 처리해야 합니다.

당연히 조건이 성립하지 않은 또 다른 경우이므로, else로 묶었구요.

 

행과 열 변수인 i와 j를 1씩 감소, 증가 시킨 후에 조건을 물어보는 이유'다음 숫자가 들어갈 위치가 선언한 범위를 초과하지 않았는가?'를 미리 확인해보기 위함입니다.

 

행의 경우 1감소 시켰을 때 0보다 작아진다면, i는 마지막 열인 4가 되어야 합니다.

열의 경우 1증가 시켰을 때, 5가 된다면 j를 0으로 세팅해야 합니다.

 

이러한 상태로 조건 검사를 끝내고, 마방진을 출력해보도록 하겠습니다.

역시 변수가 많아져서 m까지 오게 되었습니다.

 

5 * 5 마방진이 출력됩니다.

 

2-2. 동적 할당으로 구현

이제는 사용자로부터 임의의 숫자를 넘겨 받아 동적 할당으로 구현해보도록 하겠습니다.

단, 사용자의 입력값은 n에 저장하고, n은 편의상 홀수로만 받겠습니다.

 

2차원 배열을 선언하고,

 

정적 할당으로 짜볼테 설명드렸던 것처럼, 시작열을 n / 2로, k는 n * n 까지 반복하며,

nmg는 k를 n으로 나눈 나머지 값을 넣겠습니다.

 

행, 열 인덱스 변환도 사용자 입력값을 변수로 넣어줬어요.

 

력도 행, 열 모두 n까지 반복하며 뽑아보겠습니다.

그리고 실행하겠습니다!

짝수 입력받으면 거절 메시지도 잘 나오구요.

임의의 숫자 9를 입력해보겠습니다.

네. 9*9 마방진이 잘 출력되네요! : )

 


지금까지 2차원 배열을 활용한 마방진 만들기에 대해 포스팅하였습니다.

 

다음 시간에 뵙겠습니다!!