구수략에서 나오는 재미있는 방진들-1강 2x2 방진

Category:
Difficulty:
Date: 2026-04-18
Read Time: 6 mins read
Views: 조회

정말 재미있는 당신을 위한 구수략

먼저 짚고 넘어갈 것이, 이 책이 비록 300년이 넘은 교본일지언정 이것의 본질은 수학에 있다. 이것이 다루는 범위는 정석적인 마방진부터, 오일러 방진을 비롯한 다양한 것에 있다. 이번에 다룰 것은 시작부터 재미가 있다. 아마 초등학교 과정에서부터 이런 것을 가르쳤다면 아무도 안 졸았을 것이라고 생각한다. 그런 수포자의 관점이니 대부분 프로그래밍적으로 이론을 풀 것이다.

첫 번째 방진

행/열 1열 2열
1행 9 1
2행 8 2

이것은 일관적으로 규칙이 적용된 것이 아닌, 어떤 방향인지에 따라 규칙이 다르기에 값만 보고 규칙을 알기 힘들다. 그러나 차근차근 뜯어보면 무엇인지 알 수 있다. 이것을 파이썬으로 선언한다.

square = [[9, 1], [8, 2]]

다음 코드로 이것의 가로 행을 더해 보자. 파이썬으로 간단하게 덧셈 코드를 작성하면 된다.

if sum(square[0]) == sum(square[1]):
    print("두 행의 합이 같습니다.")

결과

>>> square = [[9, 1], [8, 2]]
>>> if sum(square[0]) == sum(square[1]):
...     print("두 행의 합이 같습니다.")
...
두 행의 합이 같습니다.

그러나 다음이 문제다. 이 다음은 바로 눈에 들어오지는 않는다. 열에서 어떠한 규칙이 있는지 찾는다. 단순 사칙 연산은 덧셈, 뺄셈, 곱셈, 나눗셈이다. 일단 합과 차를 먼저 비교한다.

square_transposed = list(map(list, zip(*square)))

def sub(lst):
    return abs(lst[0] - lst[1])

if sum(square_transposed[0]) == sum(square_transposed[1]):
    print("두 열의 합이 같습니다.")
elif sub(square_transposed[0]) == sub(square_transposed[1]):
    print("두 열의 차가 같습니다.")
else:
    print("다른 규칙이 있을까요?")

결과

>>> if sum(square_transposed[0]) == sum(square_transposed[1]):
...     print("두 열의 합이 같습니다.")
... elif sub(square_transposed[0]) == sub(square_transposed[1]):
...     print("두 열의 차가 같습니다.")
... else:
...     print("다른 규칙이 있을까요?")
...
두 열의 차가 같습니다.

대각선

두 열의 차가 같다. 이제 방진의 꽃인 대각선이다.

if square[0][0] + square[1][1] == square[0][1] + square[1][0]:
    print("두 대각선의 합이 같습니다.")
elif abs(square[0][0] - square[1][1]) == abs(square[0][1] - square[1][0]):
    print("두 대각선의 차가 같습니다.")
else:
    print("다른 무언가가 있을까요?")

결과

>>> if square[0][0] + square[1][1] == square[0][1] + square[1][0]:
...     print("두 대각선의 합이 같습니다.")
... elif abs(square[0][0] - square[1][1]) == abs(square[0][1] - square[1][0]):
...     print("두 대각선의 차가 같습니다.")
... else:
...     print("다른 무언가가 있을까요?")
...
두 대각선의 차가 같습니다.

다른 예시 두 가지는 직접 대입해서 알아 보자.

행/열 1열 2열
1행 7 3
2행 6 4
행/열 1열 2열
1행 3 7
2행 3 7

이 둘도 가로, 세로, 대각선을 모두 같은 규칙으로 만들지 못해서 비슷하게 비틀려 있다. 아름답지만 어딘가 묘하게 엉뚱한 것이, 굳이 행의 경우만 합이 같게 설계되어 있다. 이러한 규칙은 컴퓨터 과학에서 어떻게 자료를 장악하는 데에 쓰일 수 있는가? 따지고 보면 이것은 무결성에 대한 이야기이지만, 왜 2x2에서는 굳이 이래야 한다고 서술한 것일까?

독자 군, 나 사실은 마방진이 되어 본 적 없어…

요즈음 체인소맨에서 생긴 유행어라고 하나? 좀 어이없게 써 먹었지만, 이 말 그대로다. 2x2 마방진은 수학적으로 존재하지 않는다. 대신 2x2에서는 행, 열, 대각선에 동일한 연산 규칙을 동시에 적용할 수 없다. 구수략은 이런 구조에서 부분적인 산술 균형을 만드는 방법을 간략하게 정리한다. 필요하다면 재인쇄된 영인본을 참고하면 좋다. 또한 2x2는 라틴 방진은 되나 직교 라틴 방진은 불가능하다.

행/열 1열 2열
1행 1 2
2행 2 1
행/열 1열 2열
1행 2 1
2행 1 2

이 두 방진을 겹치면 직교 라틴 방진이 있는지 알 수 있다. 직교하려면 1과 2로 만드는 모든 조합이 한 번씩 나와야 한다. 즉 (1,1), (1,2), (2,1), (2,2)가 나와야 한다. 그러나 이것은 (1,2) 두 번, (2,1) 두 번으로 중복 쌍이 존재하고 누락 쌍이 두 쌍이다. 이러한 까닭으로 직교 방진도 불가능하고, 마방진도 불가능하다는 것이 드러난다. 여기서 흥미로운 점은 최석정이 완전한 마방진 대신 부분적인 산술 균형 구조를 별도로 다뤘다는 점이다. 이것을 보면 그의 연구 방향은 n*m 배열에서의 산술적 평형에 대한 것이라고 할 수 있다. 현대적인 제목을 붙이자면 ‘NxM 배열의 산술적 평형에 대한 연구’라고 해야 하나? 어라… 그럼 왜 앞에서 좁쌀의 합이니 차니 하는 것을 책에서 서술한 거죠? 그리고 태양수니 태음수니 그건 무슨 중세 연금술 같던데 뭐죠? 라고 하는 독자가 있을 수 있다. 솔직하게 말하면 여기에 명리학이니 어쩌니 엮는 사람들은 좀 한 대 때려 주고 싶다. 그 시절의 산술적 용어일 뿐이다. 질 나쁜 번역본을 보거든 적당히 넘겨라. 그냥 숫자의 흐름을 보면 된다. 이만큼 재미가 있는 것이 마방진과 그에 대한 이론이다. 이후 추가적인 것들은 더 가져오겠다.

Document Classification

Primary Category
Subcategory
Keywords
Math 수학 Personal Project 개인 프로젝트
Difficulty
Permalink
https://gg582.github.io/devnote/2026-04-18-%EA%B5%AC%EC%88%98%EB%9E%B5%EC%97%90%EC%84%9C-%EB%82%98%EC%98%A4%EB%8A%94-%EC%9E%AC%EB%AF%B8%EC%9E%88%EB%8A%94-%EB%B0%A9%EC%A7%84%EB%93%A4-1%EA%B0%95-2x2-%EB%B0%A9%EC%A7%84/

Citation

이윤진(Lee Yunjin) (2026). 구수략에서 나오는 재미있는 방진들-1강 2x2 방진. 윤진의 IT 블로그. Retrieved from https://gg582.github.io/devnote/2026-04-18-%EA%B5%AC%EC%88%98%EB%9E%B5%EC%97%90%EC%84%9C-%EB%82%98%EC%98%A4%EB%8A%94-%EC%9E%AC%EB%AF%B8%EC%9E%88%EB%8A%94-%EB%B0%A9%EC%A7%84%EB%93%A4-1%EA%B0%95-2x2-%EB%B0%A9%EC%A7%84/
── 하략 ──