우선 집합 에 들어가는 수에 , 집합 에 들어가는 수에 을 부여해서 두 집합의 상태를 bool string으로 표현해봅시다. 예를 들어, 집합 에 이 있고, 집합 에 가 있다면 이를 로 표현할 수 있습니다.
그러면 이제 집합에서 연속한 수들을 옮기는 작업이 string에서는 또는 으로 바꾸는 연산과 동일합니다.
이러한 연산의 형태는 Peg Solitaire 퍼즐로 잘 알려져 있고, 일반적인 이 퍼즐은 2차원의 작은 십자가 보드에서 진행됩니다.
이 문제는 1차원 보드에서 진행되는 Peg Solitaire 퍼즐로 해석할 수 있고, 이 퍼즐에서 해결 가능한(을 하나만 남길 수 있는) 초기 형태는 대략 8가지의 정규식(regular expression)으로 표현할 수 있습니다. (참고: arXiv:math/0008172) 이는 역연산( 또는 )을 통해 유도가 가능하다는 정도로 간략히 말씀드리겠습니다.
해결 가능한 1차원 Peg Solitaire 퍼즐의 초기 형태 정규식 중 연속한 0이 없는 형태는 다음과 같습니다.
/11(01)*(11)*1011(10)*11/
/11(01)*1101(11)*(10)*11/
/11(01)*(11)*01/
/10(11)*(10)*11/
()*
는 괄호 안의 문자들을 0번 이상 반복하겠다는 의미입니다. 예시로, /1(10)*/
는 1
, 110
, 11010
등을 포함하는 string 집합의 표현입니다.문제를 다시 보면 1차원 Peg Solitaire 퍼즐에서 길이 과 의 개수 이 주어졌을 때, 해결 가능한 초기 형태 중 이 연속하지 않는 것을 출력하는 문제로 볼 수 있습니다.
다시 정규식으로 돌아가서 우선 길이 이 5 이상일 때, "양 끝이 이고" 해결 가능한 string은 이 짝수일 때만 가능함을 알 수 있습니다. 그렇기 때문에 이 홀수라면 무조건 첫 자리 또는 마지막 자리를 으로 둬야 합니다. 편의상 첫 자리를 으로 두겠습니다.
그래서 정규식 중 /10(11)*(10)*11/
를 사용하여, 이 홀수일 때는 /010(11)*(10)*11/
, 짝수일 때는 /10(11)*(10)*11/
가 정답이 됩니다. 단, 이 홀수일 때 이 1이라면 위 정규식에선 이 최소 두 개 필요했기 때문에 정답이 될 수 없습니다. 그래서 이 경우는 -1
을 출력하고, 나머지는 각 정규식에서 의 index를 전부 출력해주면 AC를 받을 수 있습니다.