====== 룩 vs 폰 ====== ===== 풀이 ===== * 경우를 나눠서 생각해보자. * 먼저 처음 보드에 폰이 룩과 같은 파일에 있는 경우 (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() {{tag>BOJ ps:problems:boj:플래티넘_5}}