1인용 신경쇠약
면접 대비시간 제한2초메모리 제한1024 MB
H×W 격자의 같은 번호 카드 쌍을 모두 없애는 데 필요한 턴 수를 구합니다. 홀수 행은 왼쪽부터, 짝수 행은 오른쪽부터 카드를 뒤집고 본 카드를 기억합니다.
문제
카드가 장 있다. 여기서 는 짝수이다. 각 카드의 앞면에는 부터 까지의 수 중 하나가 적혀 있으며, 같은 수가 적힌 카드는 정확히 두 장이다. 이 카드로 어떤 카드 게임을 할 수 있을지 생각하다가 1인용 신경쇠약을 하기로 했다.
1인용 신경쇠약에서는 먼저 장의 카드를 뒷면이 보이도록 직사각형 판에 늘어놓는다. 목표는 턴을 반복하여 판에서 모든 카드를 제거하는 것이다. 각 턴에서는 반드시 카드 두 장을 뒤집어야 한다. 뒤집은 두 카드의 앞면 수가 같으면 그 두 장을 판에서 제거한다. 다르면 두 카드를 다시 뒤집어 뒷면이 보이게 한다. 다만 기억력이 완벽하여, 한 번 뒤집은 카드의 수와 놓인 위치는 모두 기억한다. 따라서 각 턴마다 다음과 같이 행동한다.
- 두 번째 이후 턴이고, 이전 턴들을 통해 같은 수가 적힌 카드 두 장의 위치를 이미 알고 있다면, 그 두 장을 뒤집어 판에서 제거한다.
- 그렇지 않으면, 아직 뒤집지 않은 카드 중 우선순위가 가장 높은 카드를 한 장 뒤집는다(카드의 우선순위는 뒤에서 정의한다). 이 카드의 수를 이미 뒤집혀 있는 다른 카드에서 본 적이 있다면, 다른 카드를 뒤집어 두 장을 판에서 제거한다.
- 그렇지 않으면, 아직 뒤집지 않은 카드 중 우선순위가 가장 높은 카드를 한 장 더 뒤집는다. 이번 턴에 처음 뒤집은 두 카드의 수가 (운 좋게) 같으면 두 장을 판에서 제거한다.
- 그렇지 않으면, 뒤집은 두 카드를 뒷면이 보이게 하여 다음 턴을 준비한다.
행은 위에서부터 번부터 번까지 번호를 붙인다. 남은 카드 중 가장 위쪽 행에 있는 카드가 우선순위가 가장 높다. 가장 위쪽 행에 카드가 여럿 있으면, 그 행의 원래 번호가 홀수 행이면 가장 왼쪽 카드가, 원래 번호가 짝수 행이면 가장 오른쪽 카드가 우선순위가 가장 높다.
게임을 끝낸 뒤, 모든 카드를 제거하는 데 턴을 몇 번 썼는지 세지 않았다는 것을 깨달았다. 다행히 카드의 초기 배치는 기억하고 있다. 그래서 주어진 초기 배치에 대해 모든 카드를 제거하는 데 걸리는 턴 수를 계산하는 프로그램을 작성하기로 했다.
입력
첫 번째 줄에 두 정수 ()와 ()가 주어진다. 는 짝수라고 가정해도 된다. 이어지는 개의 줄에는 각각 정확히 개의 정수가 있다. 번째 줄의 번째 정수는 위에서 번째, 왼쪽에서 번째 카드의 앞면 수를 나타낸다. 개 줄의 모든 정수는 이상 이하이며, 같은 정수는 정확히 두 번 나타난다고 가정해도 된다.
출력
모든 카드를 제거하는 데 걸린 턴 수를 나타내는 정수 하나를 한 줄에 출력한다.