일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 티스토리챌린지
- 일론 머스크
- AI
- AI 기술
- 아두이노
- 뉴럴링크
- 서보모터
- PYTHON
- LLM
- ControlNet
- 휴머노이드 로봇
- 생성형 AI
- 트랜스포머
- 딥마인드
- 시간적 일관성
- 인공지능
- LORA
- ubuntu
- TRANSFORMER
- OpenAI
- 우분투
- 메타
- 오픈AI
- 확산 모델
- 오블완
- tts
- 딥러닝
- ChatGPT
- 가상환경
- 멀티모달
- Today
- Total
AI 탐구노트
마법같은 숫자의 조합 - 마방진(魔方陣) 본문
혹시 '마방진(魔方陣)'이라고 들어 보셨나요? 저는 초등학교 때 책을 통해 접했습니다. 정사각형 형태의 숫자 배열이 가로, 세로, 대각선의 합이 모두 같은 특징을 가지는 이것은 당시로서는 엄청나게 신기한 장난감이었습니다. 당시 봤었던 책에는 만드는 방법이 소개되어 있었는데, 친구들과 커다란 종이 (A0 아니면 A1이었던 것 같네요)에 엄청 큰 마방진을 만들어 보기도 했었습니다. 당시 봤었던 원리를 현재도 고스란히 기억하고 있죠.
이번 글에서는 마방진에 대한 간략한 소개와 제가 기억하고 있는 직접 만드는 방법, 그리고 코드를 통해 생성하는 방법 이렇게 정리해서 알려 드리도록 하겠습니다.
마방진(魔方陣, Magic Square)이란?
마방진은 '가로, 세로, 대각선의 합이 모두 같은 정사각형 형태의 숫자 배열'입니다. '마방진(魔方陣)'에서 '魔'는 신비롭다, '方'은 사각형을 의미하며 '陣'은 줄지어 선 모습을 의미하죠. 가장 작은 것은 기본적인 3×3부터, 한쪽의 크기가 홀수이거나 4의 배수, 소수로 구성된 마방진, 혹은 (홀수x4의배수)^2 크기의 확장 마방진 등등 다양한 형태가 있습니다.
마방진의 유래
마방진은 전설에 따르면 4천 여년 전 중국 하나라 우왕 때 황허강의 범람을 막기 위해 치수 공사를 하던 중에, 지류인 낙수(洛水)에서 발견된 45개의 점들이 새겨진 거북 등껍데기(지류 이름을 따서 낙서(洛書)라 부름)의 배열에서 유래되었다고 합니다. 이후 이것은 인도, 이슬람, 유럽으로 전파되었고, 이후 다양한 형태의 연구가 진행되어 왔다고 합니다.
우리나라에 처음 마방진이 소개된 것은 남송 시대 양휘의 '양휘산법'이라는책을 통해서라고 합니다. 조선 숙종 때 영의정이자 천문학에 조예가 있었던 최석정이 일종의 수학책인 '구수략'이라는 책을 썼는데 거기에는 다양한 크기의 마방진들이 실려 있습니다. 특히 그 속에 소개된 '지수귀문도'라 불리는 세계 최초의 9차 직교라틴 방진은 스위스의 Leonhard Euler가 1776년 논문에 발표하기 60여년 전이라고 합니다. 지수귀문도는 일반적인 정사각형 형태가 아닌 6각형 구조가 3x3으로 합쳐진 독특한 형태인데 현재도 이에 대한 연구를 진행하고 있는 곳도 있습니다. (관련링크)
마방진과 관련된 에피소드
마방진과 관련해 얽힌 얘기들을 찾다보니 몇 가지 재미난 것들이 있었습니다.
- 과거에는 마방진이 가지는 신비한 원리 때문에 악귀를 쫓을 때 부적처럼 사용되기도 했답니다.
- 삼국지에 나오는 제갈공명이 마방진을 이용해 군사 배치를 했다는 얘기가 있었습니다.
- 우리나라에 처음 마방진이 소개된 것은 남송 시대 양휘의 '양휘산법'이라는책을 통해서라고 합니다.
- 조선 숙종 때 영의정이자 천문학에 조예가 있었던 최석정이 세계 최초로 9차 직교 마방진 '지수귀문도'를 고안 했습니다.
마방진 생성 방법
앞서 마방진을 학문적으로 연구하고 있는 곳도 있다고 말씀 드렸는데 이 글에서는 그런 수준은 근처에 가지도 않을거고 생활 상에서 재미로 만들어 볼 수 있는 수준의 것만 소개하겠습니다. 홀수 크기 마방진, 그리고 4의 배수 크기 마방진 이렇게 딱 두 가지만 말이죠. 물론 마방진의 크기와 최소수가 고정된다고 1가지 형태만 나오는 것은 아닙니다.
1) 홀수 크기 마방진
홀수 마방진을 생성하는 알고리즘은 다음의 절차를 따릅니다.
- 최소 숫자를 마방진 첫행 중간열에 둡니다.
- 배치한 숫자의 오른 쪽 대각선 위에 다음 숫자를 배치합니다. 만약 범위를 넘어가면 반대쪽 끝에 기록하고
- 만약 다른 숫자가 이미 있거나 반대편으로 넘어갈 수 없다면 현재 위치 아래에 숫자를 둡니다.
제가 어린 시절 봤던 책에서는 홀수 마방진 만드는 방법을 다음과 같이 설명하고 있었습니다. 목표로 하는 마방진의 크기 대비 바깥으로 더 넓혀두어야 하는 단점이 있죠. 하지만, 대신 굉장히 직관적이긴 합니다. 결국 위의 설명과 같은 알고리즘을 사용하고 있습니다.
2) 4의 배수 크기 마방진
제가 기억하고 있는 4의 배수 크기의 마방진을 만드는 방법입니다. 아래 그림처럼 4x4 크기로 다시 쪼개고 대각선으로 색을 칠합니다. (마음 속으로...) 그런 뒤 전체 판에서 색칠된 부분만 가장 작은 숫자부터 순서대로 기입하고 끝나면 맨 마지막에서부터 거꾸로 색칠 안 된 부분의 숫자를 채우는 방식입니다.
마방진을 코드로 만들기
1) 코드
마방진 생성 코드는 다음과 같습니다. 각각 홀수 크기 마방진, 4의 배수 크기 마방진을 생성하는 함수와 각 행과 열, 대각선의 합을 계산하는 함수로 구성되어 있습니다.
def generate_odd_magic_square(n, start_num):
magic_square = [[0] * n for _ in range(n)]
num = start_num
i, j = 0, n // 2 # 맨 위 가운데부터 시작
while num < start_num + n**2:
magic_square[i][j] = num
num += 1
# 다음 위치 계산
new_i, new_j = (i - 1) % n, (j + 1) % n
if magic_square[new_i][new_j] != 0: # 이미 채워져 있다면
i = (i + 1) % n # 한칸 아래로 이동
else:
i, j = new_i, new_j
return magic_square
def generate_doubly_even_magic_square(n, start_num):
magic_square = [[0] * n for _ in range(n)]
current = start_num
for i in range(n):
for j in range(n):
magic_square[i][j] = current
current += 1
for i in range(n):
for j in range(n):
if (i % 4 == j % 4) or ((i + j) % 4 == 3):
magic_square[i][j] = start_num + n * n - (magic_square[i][j] - start_num) - 1
return magic_square
def print_magic_square(magic_square):
for row in magic_square:
print(" ".join(f"{num:2}" for num in row))
def print_sum_result(magic_square):
# 각 행, 열, 대각선의 합 계산 및 출력
row_sums = [sum(row) for row in magic_square]
col_sums = [sum(magic_square[i][j] for i in range(n)) for j in range(n)]
diag_sum1 = sum(magic_square[i][i] for i in range(n))
diag_sum2 = sum(magic_square[i][n-1-i] for i in range(n))
print("\n각 행의 합:", row_sums)
print("각 열의 합:", col_sums)
print("대각선의 합:", diag_sum1, diag_sum2)
# 사용자로부터 마방진의 크기와 시작 숫자 입력 받기
n = int(input("마방진의 크기(n)을 입력하세요 (홀수 또는 4의 배수): "))
start_num = int(input("마방진에서 사용될 가장 작은 숫자를 입력하세요: "))
if n % 2 != 0: # 홀수 마방진
magic_square = generate_odd_magic_square(n, start_num)
print_magic_square(magic_square)
print_sum_result(magic_square)
elif n % 4 == 0: # 4의 배수 마방진
magic_square = generate_doubly_even_magic_square(n, start_num)
print_magic_square(magic_square)
print_sum_result(magic_square)
else:
print("마방진의 크기는 홀수 또는 4의 배수여야 합니다.")
2) 실행 결과 확인
홀수 마방진의 경우
$ python mabangjin.py
마방진의 크기(n)을 입력하세요 (홀수 또는 4의 배수): 5
마방진에서 사용될 가장 작은 숫자를 입력하세요: 1
17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9
각 행의 합: [65, 65, 65, 65, 65]
각 열의 합: [65, 65, 65, 65, 65]
대각선의 합: 65 65
4의 배수 마방진의 경우,
$ python mabangjin.py
마방진의 크기(n)을 입력하세요 (홀수 또는 4의 배수): 8
마방진에서 사용될 가장 작은 숫자를 입력하세요: 5
68 6 7 65 64 10 11 61
13 59 58 16 17 55 54 20
21 51 50 24 25 47 46 28
44 30 31 41 40 34 35 37
36 38 39 33 32 42 43 29
45 27 26 48 49 23 22 52
53 19 18 56 57 15 14 60
12 62 63 9 8 66 67 5
각 행의 합: [292, 292, 292, 292, 292, 292, 292, 292]
각 열의 합: [292, 292, 292, 292, 292, 292, 292, 292]
대각선의 합: 292 292
예전처럼 손으로 만들어보던 즐거움은 없었지만 그래도 뭔가가 뚝딱하고 나오는 것을 보면 언제나 기분이 좋습니다. ^^
정리하며
마방진을 보면서 '질서와 균형'이라는 개념이 떠올랐습니다. 마치 사회의 구성원들이 서로 조화를 이뤄가며 상생하는 그런 모습인데요, 한 사람이 너무 많은 것을 가지면 균형이 깨지고, 각자 적절한 몫을 가질 때 비로소 안정이 유지되는 그런 원리 말입니다. 숫자를 '크기'로 평가하지만 않으면 각자의 역할이 가장 최적의 위치에 갈 수 있도록 하는 '배치'의 문제로 바뀌게 되겠죠. 이 사회가 가장 안정적으로 굴러갈 수 있도록 적재적소에 사람을 배치하고 이들이 가장 좋은 시너지를 낼 수 있도록 하는 방법으로 연구해 볼만한 가치가 있어 보였습니다. 흠... 너무 나갔나요? ^^;
마방진은 현대조합수학의 기초가 되었다고 합니다. 하지만, 마방진이 단순히 숫자의 배열 뿐이라면 우리가 과연 그 매력을 느낄 수 있을까요? 아니겠죠! 제게 마방진은 그저 '재미난 퍼즐' 입니다. 수학전공자가 아니면 대부분 비슷한 느낌이지 않을까 싶습니다. 편하게 가지고 놀 수 있는 그런 장난감같이 말이죠. 그 얘기는 어린 아이들도 간단한 마방진의 원리를 설명해 주면 좋아할 것이라는 겁니다. 그러니 어린 자녀나 조카가 있다면 꼭 한번 마방진을 가지고 함께 놀아 보시기 바랍니다. ^^
참고자료
- 논문) A study on solutions of Jisuguimundo using the range of magic sums (링크)
- 사이트) 퍼즐러갱님의 퍼즐박물관 (Puzzler Gang's Puzzle Museum) (링크)
'DIY 테스트' 카테고리의 다른 글
흡연 감지 : 다같이 사는 세상, AI로 유도하는 작은 배려 (1) | 2025.01.04 |
---|---|
인공지능 영상 분석으로 화재를 감지하는 기술 (9) | 2025.01.02 |
AI를 이용한 도난 감지 : 무인화 매장 확산을 위한 필요 요소 (3) | 2024.12.28 |
체스(Chess) : 코딩으로 만나는 체스, 재미를 더하다 (3) | 2024.12.20 |
speck : 라인을 이용한 이미지 렌더링 도구 (1) | 2024.12.17 |