diff --git a/백준/Gold/33961. 체스평평설/README.md b/백준/Gold/33961. 체스평평설/README.md
new file mode 100644
index 0000000..ee19bf2
--- /dev/null
+++ b/백준/Gold/33961. 체스평평설/README.md
@@ -0,0 +1,46 @@
+# [Gold V] 체스평평설 - 33961
+
+[문제 링크](https://www.acmicpc.net/problem/33961)
+
+### 성능 요약
+
+메모리: 34456 KB, 시간: 48 ms
+
+### 분류
+
+애드 혹, 해 구성하기, 많은 조건 분기
+
+### 제출 일자
+
+2026년 2월 9일 20:08:22
+
+### 문제 설명
+
+
찬우는 더 이상 지구나 나무 같은 따분한 것을 평평하게 만들기에 지쳤다. 대신 체스의 아름다움에 푹 매료되어 체스판을 평평하게 만들기로 결심했다!
+
+"잠깐 wait! 체스판은 원래 평평한거 아닌가요?"
+
+날카로운 지적이다. 하지만 의심이 많은 찬우는 굳이 체스판이 평평한지 직접 확인을 해보려고 한다. 먼저, 찬우는 나숍(Knishop)이라는 기물을 준비했다. 나숍(Knishop)은 체스에서 나이트외 비숍의 특징을 합친 기물로, $2 \times 1$만큼 대각선으로 이동하거나 대각선 방향으로 원하는 만큼 이동할 수 있다.
+
+
+
+체스판에서 나숍이 이동할 수 있는 곳
+
+이제 찬우는 준비한 나숍을 체스판의 임의의 위치에 두고, 해당 위치를 시작으로 모든 체스판의 칸을 정확히 1번씩만 들르는 Knishop-tour를 할 것이다. 모든 칸을 들르면서 각 칸의 높이가 일정한지 확인하는 것으로 찬우는 체스평평설을 자신있게 지지할 수 있게 될 것이다.
+
+마침 찬우는 동방에서 체스평평설의 좋은 근거가 되어줄 수 있는 $2 \times M$ 모양의 체스판을 발견했지만, 정작 어떤 순서로 Knishop-tour를 돌아야 할지 몰라 곤경에 처했다. 찬우를 도와 Knishop-tour 경로를 대신 만들어주자!
+
+### 입력
+
+ 첫 번째 줄에 체스판의 크기를 나타내는 $M$이 주어진다. 이는 체스판이 $2 \times M$ 모양임을 의미한다. $(1 \le M \le 10000)$
+
+### 출력
+
+ 주어진 체스판에서 Knishop-tour가 가능하다면 첫 번째 줄에 YES를 출력한다.
+
+이후 $2 \times M$개의 줄에서는 Knishop-tour의 경로를 차례대로 출력한다. 각 $i$번째 줄에는 Knishop-tour의 $i$번째 보드칸의 위치 $(x_i,y_i)$를 공백으로 구분하여 출력해야 하며, $1 \le x_i \le 2, 1 \le y_i \le M$을 만족해야 한다.
+
+이때 경로의 시작 및 끝 좌표는 아무 곳에서 시작할 수 있고, 아무 곳에서 끝날 수 있다. 문제의 조건을 만족하는 경로가 여러가지일 경우 아무거나 출력해도 된다.
+
+Knishop-tour가 불가능하다면 첫 번째 줄에 NO를 출력한다.
+
diff --git a/백준/Gold/33961. 체스평평설/체스평평설.py b/백준/Gold/33961. 체스평평설/체스평평설.py
new file mode 100644
index 0000000..2c0e947
--- /dev/null
+++ b/백준/Gold/33961. 체스평평설/체스평평설.py
@@ -0,0 +1,59 @@
+import sys
+input = sys.stdin.readline
+
+M = int(input().strip())
+
+if M <= 2:
+ print("NO")
+ sys.exit()
+
+ans = []
+
+def add_block3(a):
+ ans.append((1, a))
+ ans.append((2, a + 1))
+ ans.append((1, a + 2))
+ ans.append((2, a))
+ ans.append((1, a + 1))
+ ans.append((2, a + 2))
+
+def add_last4(a):
+ ans.append((1, a))
+ ans.append((2, a + 1))
+ ans.append((1, a + 3))
+ ans.append((2, a + 2))
+ ans.append((1, a + 1))
+ ans.append((2, a))
+ ans.append((1, a + 2))
+ ans.append((2, a + 3))
+
+def add_last5(a):
+ ans.append((1, a))
+ ans.append((2, a + 1))
+ ans.append((1, a + 3))
+ ans.append((2, a + 4))
+ ans.append((1, a + 2))
+ ans.append((2, a))
+ ans.append((1, a + 1))
+ ans.append((2, a + 2))
+ ans.append((1, a + 4))
+ ans.append((2, a + 3))
+
+r = M % 3
+
+if r == 0:
+ for a in range(1, M + 1, 3):
+ add_block3(a)
+elif r == 1:
+ for a in range(1, M - 3, 3):
+ add_block3(a)
+ add_last4(M - 3)
+else:
+ for a in range(1, M - 4, 3):
+ add_block3(a)
+ add_last5(M - 4)
+
+print("YES")
+out = sys.stdout.write
+for x, y in ans:
+ out(f"{x} {y}\n")