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×1만큼 대각선으로 이동하거나 대각선 방향으로 원하는 만큼 이동할 수 있다.

+ +

+ +

체스판에서 나숍이 이동할 수 있는 곳

+ +

이제 찬우는 준비한 나숍을 체스판의 임의의 위치에 두고, 해당 위치를 시작으로 모든 체스판의 칸을 정확히 1번씩만 들르는 Knishop-tour를 할 것이다. 모든 칸을 들르면서 각 칸의 높이가 일정한지 확인하는 것으로 찬우는 체스평평설을 자신있게 지지할 수 있게 될 것이다.

+ +

마침 찬우는 동방에서 체스평평설의 좋은 근거가 되어줄 수 있는 2×M 모양의 체스판을 발견했지만, 정작 어떤 순서로 Knishop-tour를 돌아야 할지 몰라 곤경에 처했다. 찬우를 도와 Knishop-tour 경로를 대신 만들어주자!

+ +### 입력 + +

첫 번째 줄에 체스판의 크기를 나타내는 M이 주어진다. 이는 체스판이 2×M 모양임을 의미한다. (1M10000)

+ +### 출력 + +

주어진 체스판에서 Knishop-tour가 가능하다면 첫 번째 줄에 YES를 출력한다.

+ +

이후 2×M개의 줄에서는 Knishop-tour의 경로를 차례대로 출력한다. 각 i번째 줄에는 Knishop-tour의 i번째 보드칸의 위치 (xi,yi)를 공백으로 구분하여 출력해야 하며, 1xi2,1yiM을 만족해야 한다.

+ +

이때 경로의 시작 및 끝 좌표는 아무 곳에서 시작할 수 있고, 아무 곳에서 끝날 수 있다. 문제의 조건을 만족하는 경로가 여러가지일 경우 아무거나 출력해도 된다.

+ +

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")