ps:problems:boj:34982
룩 vs 폰
| ps | |
|---|---|
| 링크 | acmicpc.net/… |
| 출처 | BOJ |
| 문제 번호 | 34982 |
| 문제명 | 룩 vs 폰 |
| 레벨 | 플래티넘 5 |
| 분류 |
게임 이론 |
| 시간복잡도 | O(1) |
| 사용한 언어 | Python 3.13 |
| 제출기록 | 32412KB / 40ms |
| 최고기록 | 32ms |
| 해결날짜 | 2025/12/30 |
풀이
- 경우를 나눠서 생각해보자.
- 먼저 처음 보드에 폰이 룩과 같은 파일에 있는 경우 (M⇐N), 이때는 그냥 첫수에 룩이 폰을 먹으면 끝난다. 답은 1회
- M>N 일 경우에는, 룩이 폰과 같은 파일로 이동한 뒤에 올라가서 잡아야 하므로, 최소 2수 이상이 걸린다. 폰의 개수에 따라서 달라진다
- 폰이 한개(N=1) 일 때에는, 룩이 폰과 같은 파일로 가서 폰을 위협해도 폰이 앞으로 이동하는 것 밖에 할수 없다. 다음수에 룩이 올라가서 잡으면 된다. 답은 2회
- 폰이 두개(N=2) 일 때에는, 1)룩이 1번파일로 이동 ⇒ 1번폰이 한칸 전진, 2)룩이 2번파일로 이동 ⇒ 2번폰이 두칸 전진, 3)룩이 1번파일로 이동 ⇒ 어떻게 해도 방어 불가 4) 룩이 폰을 잡는다. 의 단계를 거치게 된다. 답은 4회
- 폰이 세개(N=3) 일 때에는 위의 방법을 쓰면 안된다. 2)번 단계에서, 2번 폰이 한칸만 전진해도 3번폰의 보호를 받을 수 있어서, 그렇게 이동하면 수가 많이 지연된다. 최적의 방법은 1)룩이 1번파일로 이동 ⇒ 1번폰이 한칸 전진, 2)룩이 3번파일로 이동 ⇒ 3번폰이 한칸 전진, 3)룩이 2번파일로 이동 ⇒ 2번 폰이 두칸 전진 4)룩이 1번파일로 이동 ⇒ 어떻게 해도 방어 불가 5)룩이 폰을 잡는다. 의 단계를 거쳐서 5회 이동으로 폰을 잡는 것이다
- 폰이 4개 이상이어도 세개일때와 똑같은 방법을 적용할수 있기 때문에, 5회로 잡을수 있다.
- 여기까지가 간단히 생각해서 나올수 있는 풀이인데. 이대로 구현해서 제출하면 WA를 받을 것이다 (?!)
- 사실 위에서 빼놓은 케이스가 있다. 체스에 익숙한 사람이면 추크추방이라는 이름으로 비교적 쉽게 떠올릴 수도 있을 듯 한데, 체스에 익숙하지 않다면 처음에 여기까지 떠올려서 첫 제출에 AC를 받는것은 꽤나 어려울 것으로 생각한다.
- 폰이 두개일 때에, 첫수에 룩으로 바로 폰을 공격하러 가는 대신에, 그냥 다른 빈 파일로 이동을 하는 방법이다. 그러면 상대는 1번폰 또는 2번폰을 올리게 된다. 이제 두번째수로, 그 움직인 폰과 같은 파일로 룩을 이동시키면, 상대는 그 폰을 지킬수 있는 방법이 없다. 그래서 세번째 수로 폰을 잡을수 있다.
- 정리하면, 폰이 두개이고(N=2), 룩이 움직일 빈 파일이 있는 경우 (K>3)에는 4수가 아닌 3수로 폰을 잡을수 있다.
- 구현은 간단하다. 시간복잡도는 당연히 O(1)
코드
"""Solution code for "BOJ 34982. 룩 vs 폰".
- Problem link: https://www.acmicpc.net/problem/34982
- Solution link: http://www.teferi.net/ps/problems/boj/34982
Tags: [game theory]
"""
def main():
N, M, K = [int(x) for x in input().split()]
if M <= N:
print('1')
elif N == 1:
print('2')
elif N == 2:
print('4' if K == 3 else '3')
else:
print('5')
if __name__ == '__main__':
main()
ps/problems/boj/34982.txt · 마지막으로 수정됨: 2025/12/30 14:28 저자 teferi

토론