[Gold V] Title: 체스평평설, Time: 48 ms, Memory: 34456 KB -BaekjoonHub

This commit is contained in:
SSUM
2026-02-09 20:08:32 +09:00
parent 0ae3937bbe
commit 3484cec70c
2 changed files with 105 additions and 0 deletions

View File

@@ -0,0 +1,46 @@
# [Gold V] 체스평평설 - 33961
[문제 링크](https://www.acmicpc.net/problem/33961)
### 성능 요약
메모리: 34456 KB, 시간: 48 ms
### 분류
애드 혹, 해 구성하기, 많은 조건 분기
### 제출 일자
2026년 2월 9일 20:08:22
### 문제 설명
<p>찬우는 더 이상 지구나 나무 같은 따분한 것을 평평하게 만들기에 지쳤다. 대신 체스의 아름다움에 푹 매료되어 체스판을 평평하게 만들기로 결심했다!</p>
<p style="text-align: center;">"잠깐 wait! 체스판은 원래 평평한거 아닌가요?"</p>
<p>날카로운 지적이다. 하지만 의심이 많은 찬우는 굳이 체스판이 평평한지 직접 확인을 해보려고 한다. 먼저, 찬우는 <strong>나숍(Knishop)</strong>이라는 기물을 준비했다. 나숍(Knishop)은 체스에서 나이트외 비숍의 특징을 합친 기물로, <mjx-container class="MathJax" jax="CHTML" style="font-size: 109%; position: relative;"><mjx-math class="MJX-TEX" aria-hidden="true"><mjx-mn class="mjx-n"><mjx-c class="mjx-c32"></mjx-c></mjx-mn><mjx-mo class="mjx-n" space="3"><mjx-c class="mjx-cD7"></mjx-c></mjx-mo><mjx-mn class="mjx-n" space="3"><mjx-c class="mjx-c31"></mjx-c></mjx-mn></mjx-math><mjx-assistive-mml unselectable="on" display="inline"><math xmlns="http://www.w3.org/1998/Math/MathML"><mn>2</mn><mo>×</mo><mn>1</mn></math></mjx-assistive-mml><span aria-hidden="true" class="no-mathjax mjx-copytext">$2 \times 1$</span></mjx-container>만큼 대각선으로 이동하거나 대각선 방향으로 원하는 만큼 이동할 수 있다.</p>
<p style="text-align: center;"><img alt="" src="https://upload.acmicpc.net/4984f369-7059-415c-8dc4-cd596d2598f7/-/preview/" style="height: 400px; width: 400px;"></p>
<p style="text-align: center;"><small>체스판에서 나숍이 이동할 수 있는 곳</small></p>
<p>이제 찬우는 준비한 나숍을 체스판의 임의의 위치에 두고, 해당 위치를 시작으로 모든 체스판의 칸을 정확히 1번씩만 들르는 <strong>Knishop-tour</strong>를 할 것이다. 모든 칸을 들르면서 각 칸의 높이가 일정한지 확인하는 것으로 찬우는 체스평평설을 자신있게 지지할 수 있게 될 것이다.</p>
<p>마침 찬우는 동방에서 체스평평설의 좋은 근거가 되어줄 수 있는 <mjx-container class="MathJax" jax="CHTML" style="font-size: 109%; position: relative;"><mjx-math class="MJX-TEX" aria-hidden="true"><mjx-mn class="mjx-n"><mjx-c class="mjx-c32"></mjx-c></mjx-mn><mjx-mo class="mjx-n" space="3"><mjx-c class="mjx-cD7"></mjx-c></mjx-mo><mjx-mi class="mjx-i" space="3"><mjx-c class="mjx-c1D440 TEX-I"></mjx-c></mjx-mi></mjx-math><mjx-assistive-mml unselectable="on" display="inline"><math xmlns="http://www.w3.org/1998/Math/MathML"><mn>2</mn><mo>×</mo><mi>M</mi></math></mjx-assistive-mml><span aria-hidden="true" class="no-mathjax mjx-copytext">$2 \times M$</span></mjx-container> 모양의 체스판을 발견했지만, 정작 어떤 순서로 Knishop-tour를 돌아야 할지 몰라 곤경에 처했다. 찬우를 도와 Knishop-tour 경로를 대신 만들어주자!</p>
### 입력
<p>첫 번째 줄에 체스판의 크기를 나타내는 <mjx-container class="MathJax" jax="CHTML" style="font-size: 109%; position: relative;"><mjx-math class="MJX-TEX" aria-hidden="true"><mjx-mi class="mjx-i"><mjx-c class="mjx-c1D440 TEX-I"></mjx-c></mjx-mi></mjx-math><mjx-assistive-mml unselectable="on" display="inline"><math xmlns="http://www.w3.org/1998/Math/MathML"><mi>M</mi></math></mjx-assistive-mml><span aria-hidden="true" class="no-mathjax mjx-copytext">$M$</span></mjx-container>이 주어진다. 이는 체스판이 <mjx-container class="MathJax" jax="CHTML" style="font-size: 109%; position: relative;"><mjx-math class="MJX-TEX" aria-hidden="true"><mjx-mn class="mjx-n"><mjx-c class="mjx-c32"></mjx-c></mjx-mn><mjx-mo class="mjx-n" space="3"><mjx-c class="mjx-cD7"></mjx-c></mjx-mo><mjx-mi class="mjx-i" space="3"><mjx-c class="mjx-c1D440 TEX-I"></mjx-c></mjx-mi></mjx-math><mjx-assistive-mml unselectable="on" display="inline"><math xmlns="http://www.w3.org/1998/Math/MathML"><mn>2</mn><mo>×</mo><mi>M</mi></math></mjx-assistive-mml><span aria-hidden="true" class="no-mathjax mjx-copytext">$2 \times M$</span></mjx-container> 모양임을 의미한다. <mjx-container class="MathJax" jax="CHTML" style="font-size: 109%; position: relative;"><mjx-math class="MJX-TEX" aria-hidden="true"><mjx-mo class="mjx-n"><mjx-c class="mjx-c28"></mjx-c></mjx-mo><mjx-mn class="mjx-n"><mjx-c class="mjx-c31"></mjx-c></mjx-mn><mjx-mo class="mjx-n" space="4"><mjx-c class="mjx-c2264"></mjx-c></mjx-mo><mjx-mi class="mjx-i" space="4"><mjx-c class="mjx-c1D440 TEX-I"></mjx-c></mjx-mi><mjx-mo class="mjx-n" space="4"><mjx-c class="mjx-c2264"></mjx-c></mjx-mo><mjx-mn class="mjx-n" space="4"><mjx-c class="mjx-c31"></mjx-c><mjx-c class="mjx-c30"></mjx-c><mjx-c class="mjx-c30"></mjx-c><mjx-c class="mjx-c30"></mjx-c><mjx-c class="mjx-c30"></mjx-c></mjx-mn><mjx-mo class="mjx-n"><mjx-c class="mjx-c29"></mjx-c></mjx-mo></mjx-math><mjx-assistive-mml unselectable="on" display="inline"><math xmlns="http://www.w3.org/1998/Math/MathML"><mo stretchy="false">(</mo><mn>1</mn><mo>≤</mo><mi>M</mi><mo>≤</mo><mn>10000</mn><mo stretchy="false">)</mo></math></mjx-assistive-mml><span aria-hidden="true" class="no-mathjax mjx-copytext">$(1 \le M \le 10000)$</span></mjx-container></p>
### 출력
<p>주어진 체스판에서 Knishop-tour가 가능하다면 첫 번째 줄에 <span style="color:#e74c3c;"><code>YES</code></span>를 출력한다.</p>
<p>이후 <mjx-container class="MathJax" jax="CHTML" style="font-size: 109%; position: relative;"><mjx-math class="MJX-TEX" aria-hidden="true"><mjx-mn class="mjx-n"><mjx-c class="mjx-c32"></mjx-c></mjx-mn><mjx-mo class="mjx-n" space="3"><mjx-c class="mjx-cD7"></mjx-c></mjx-mo><mjx-mi class="mjx-i" space="3"><mjx-c class="mjx-c1D440 TEX-I"></mjx-c></mjx-mi></mjx-math><mjx-assistive-mml unselectable="on" display="inline"><math xmlns="http://www.w3.org/1998/Math/MathML"><mn>2</mn><mo>×</mo><mi>M</mi></math></mjx-assistive-mml><span aria-hidden="true" class="no-mathjax mjx-copytext">$2 \times M$</span></mjx-container>개의 줄에서는 Knishop-tour의 경로를 차례대로 출력한다. 각 <mjx-container class="MathJax" jax="CHTML" style="font-size: 109%; position: relative;"><mjx-math class="MJX-TEX" aria-hidden="true"><mjx-mi class="mjx-i"><mjx-c class="mjx-c1D456 TEX-I"></mjx-c></mjx-mi></mjx-math><mjx-assistive-mml unselectable="on" display="inline"><math xmlns="http://www.w3.org/1998/Math/MathML"><mi>i</mi></math></mjx-assistive-mml><span aria-hidden="true" class="no-mathjax mjx-copytext">$i$</span></mjx-container>번째 줄에는 Knishop-tour의 <mjx-container class="MathJax" jax="CHTML" style="font-size: 109%; position: relative;"><mjx-math class="MJX-TEX" aria-hidden="true"><mjx-mi class="mjx-i"><mjx-c class="mjx-c1D456 TEX-I"></mjx-c></mjx-mi></mjx-math><mjx-assistive-mml unselectable="on" display="inline"><math xmlns="http://www.w3.org/1998/Math/MathML"><mi>i</mi></math></mjx-assistive-mml><span aria-hidden="true" class="no-mathjax mjx-copytext">$i$</span></mjx-container>번째 보드칸의 위치 <mjx-container class="MathJax" jax="CHTML" style="font-size: 109%; position: relative;"><mjx-math class="MJX-TEX" aria-hidden="true"><mjx-mo class="mjx-n"><mjx-c class="mjx-c28"></mjx-c></mjx-mo><mjx-msub><mjx-mi class="mjx-i"><mjx-c class="mjx-c1D465 TEX-I"></mjx-c></mjx-mi><mjx-script style="vertical-align: -0.15em;"><mjx-mi class="mjx-i" size="s"><mjx-c class="mjx-c1D456 TEX-I"></mjx-c></mjx-mi></mjx-script></mjx-msub><mjx-mo class="mjx-n"><mjx-c class="mjx-c2C"></mjx-c></mjx-mo><mjx-msub space="2"><mjx-mi class="mjx-i"><mjx-c class="mjx-c1D466 TEX-I"></mjx-c></mjx-mi><mjx-script style="vertical-align: -0.15em;"><mjx-mi class="mjx-i" size="s"><mjx-c class="mjx-c1D456 TEX-I"></mjx-c></mjx-mi></mjx-script></mjx-msub><mjx-mo class="mjx-n"><mjx-c class="mjx-c29"></mjx-c></mjx-mo></mjx-math><mjx-assistive-mml unselectable="on" display="inline"><math xmlns="http://www.w3.org/1998/Math/MathML"><mo stretchy="false">(</mo><msub><mi>x</mi><mi>i</mi></msub><mo>,</mo><msub><mi>y</mi><mi>i</mi></msub><mo stretchy="false">)</mo></math></mjx-assistive-mml><span aria-hidden="true" class="no-mathjax mjx-copytext">$(x_i,y_i)$</span></mjx-container>를 공백으로 구분하여 출력해야 하며, <mjx-container class="MathJax" jax="CHTML" style="font-size: 109%; position: relative;"><mjx-math class="MJX-TEX" aria-hidden="true"><mjx-mn class="mjx-n"><mjx-c class="mjx-c31"></mjx-c></mjx-mn><mjx-mo class="mjx-n" space="4"><mjx-c class="mjx-c2264"></mjx-c></mjx-mo><mjx-msub space="4"><mjx-mi class="mjx-i"><mjx-c class="mjx-c1D465 TEX-I"></mjx-c></mjx-mi><mjx-script style="vertical-align: -0.15em;"><mjx-mi class="mjx-i" size="s"><mjx-c class="mjx-c1D456 TEX-I"></mjx-c></mjx-mi></mjx-script></mjx-msub><mjx-mo class="mjx-n" space="4"><mjx-c class="mjx-c2264"></mjx-c></mjx-mo><mjx-mn class="mjx-n" space="4"><mjx-c class="mjx-c32"></mjx-c></mjx-mn><mjx-mo class="mjx-n"><mjx-c class="mjx-c2C"></mjx-c></mjx-mo><mjx-mn class="mjx-n" space="2"><mjx-c class="mjx-c31"></mjx-c></mjx-mn><mjx-mo class="mjx-n" space="4"><mjx-c class="mjx-c2264"></mjx-c></mjx-mo><mjx-msub space="4"><mjx-mi class="mjx-i"><mjx-c class="mjx-c1D466 TEX-I"></mjx-c></mjx-mi><mjx-script style="vertical-align: -0.15em;"><mjx-mi class="mjx-i" size="s"><mjx-c class="mjx-c1D456 TEX-I"></mjx-c></mjx-mi></mjx-script></mjx-msub><mjx-mo class="mjx-n" space="4"><mjx-c class="mjx-c2264"></mjx-c></mjx-mo><mjx-mi class="mjx-i" space="4"><mjx-c class="mjx-c1D440 TEX-I"></mjx-c></mjx-mi></mjx-math><mjx-assistive-mml unselectable="on" display="inline"><math xmlns="http://www.w3.org/1998/Math/MathML"><mn>1</mn><mo>≤</mo><msub><mi>x</mi><mi>i</mi></msub><mo>≤</mo><mn>2</mn><mo>,</mo><mn>1</mn><mo>≤</mo><msub><mi>y</mi><mi>i</mi></msub><mo>≤</mo><mi>M</mi></math></mjx-assistive-mml><span aria-hidden="true" class="no-mathjax mjx-copytext">$1 \le x_i \le 2, 1 \le y_i \le M$</span></mjx-container>을 만족해야 한다.</p>
<p>이때 경로의 시작 및 끝 좌표는 아무 곳에서 시작할 수 있고, 아무 곳에서 끝날 수 있다. 문제의 조건을 만족하는 경로가 여러가지일 경우 아무거나 출력해도 된다.</p>
<p>Knishop-tour가 불가능하다면 첫 번째 줄에 <span style="color:#e74c3c;"><code>NO</code></span>를 출력한다.</p>

View File

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