윷놀이 말판 검증 (Small)

시간 제한5초메모리 제한512 MB

요약
기록된 윷 던지기 순서로 정해진 이동, 잡기, 지름길 규칙에 따라 주어진 보드 배치가 나올 수 있는지 판정합니다.
난이도

보통10점 중 7점

유형
백트래킹, 시뮬레이션, 완전 탐색
정답자
아직 제출이 없습니다

문제

윷놀이는 반달 모양의 윷가락을 던져 말을 옮기는 한국의 민속놀이다. 두 팀이 번갈아 윷을 던져 말을 움직이고, 자기 말을 모두 결승점으로 통과시킨 팀이 이긴다. 규칙은 지역마다 다르므로 여기서는 아래에 적은 규칙만 쓴다고 가정한다.

  • 도(Do): 앞으로 한 칸 간다.
  • 개(Gae): 앞으로 두 칸 간다.
  • 걸(Gul): 앞으로 세 칸 간다.
  • 윷(Yut): 앞으로 네 칸 가고, 윷을 한 번 더 던진다.
  • 모(Mo): 앞으로 다섯 칸 가고, 윷을 한 번 더 던진다.

한 번 던지면 그 팀은 움직일 수 있는 말 중 하나를 골라 나온 칸수만큼 옮긴다. 반드시 말 하나를 옮겨야 한다. 아직 출발하지 않은 말을 고르면 판 위에 올려 첫 칸부터 세어 옮긴다. 던진 순서대로 옮겨야 한다. 모가 나온 다음 걸이 나왔다면 세 칸을 먼저 옮기고 다섯 칸을 나중에 옮기는 것은 불가능하다.

자기 말이 자기 다른 말과 같은 칸에 도달하면 업기가 되어 다음 이동부터 두 말이 함께 움직인다. 자기 말이 상대 팀 말이 있는 칸에 도달하면 그 말을 잡고 윷을 한 번 더 던진다. 잡힌 말은 처음부터 다시 출발한다. 윷이나 모로 잡았을 때 더 던지는 횟수는 두 번이 아니라 한 번이다. 아직 판에 올라오지 않은 말은 잡을 수 없다.

말판의 칸에는 0번부터 28번까지 번호가 붙어 있다. 바깥 둘레는 0번에서 19번까지 이어지고, 0번이 출발점이면서 결승점이다. 20번부터 28번까지는 지름길이고 22번이 판의 가운데다. 5번, 10번, 22번에 멈춘 말은 다음에 움직일 때 지름길로 들어간다. 이 세 칸을 지나가기만 한 말은 가던 길을 그대로 따라간다. 멈춘 칸에서 앞으로 가는 순서는 다음과 같다.

멈춘 칸앞으로 가는 순서
아직 출발하지 않은 말1, 2, 3, 4, 5
1부터 4, 6부터 9, 11부터 14, 16부터 19번호가 1씩 커지는 순서로 19까지, 그다음 0
520, 21, 22, 23, 24, 15, 16, 17, 18, 19, 0
1025, 26, 22, 27, 28, 0
2021, 22, 23, 24, 15, 16, 17, 18, 19, 0
2122, 23, 24, 15, 16, 17, 18, 19, 0
2227, 28, 0
2324, 15, 16, 17, 18, 19, 0
2415, 16, 17, 18, 19, 0
2526, 22, 27, 28, 0
2622, 27, 28, 0
2728, 0
280

0번을 완전히 지나쳐야 말이 통과한 것이 된다. 19번에서 한 칸만 가면 0번에 서고, 아직 통과한 것이 아니라서 상대 말에게 잡힐 수 있다. 그래서 19번에 있는 말을 통과시키려면 두 칸 이상 가야 한다. 0번에 선 말은 다음에 몇 칸을 가든 결승점을 통과한다. 통과한 말은 다시 쓰지 않는다. 한 팀의 말이 모두 통과하는 순간 그 팀이 이기고 경기는 곧바로 멈춘다. 마지막에 윷이나 모가 나와 이겼더라도 경기가 멈춘 뒤에는 더 던지지 않는다.

용이네 가족은 A 팀과 B 팀으로 나누어 윷놀이를 했고, A 팀이 먼저 시작했다. 던진 윷은 나온 순서대로 모두 종이에 적어 두었다.

저녁 시간이 되어 자리를 비운 사이에 강아지 퍼피가 말판을 헤집어 놓았다. 아직 출발하지 않은 말과 이미 통과한 말은 판 밖에 있어서 그대로였지만, 판 위에 있던 말은 위치를 믿을 수 없게 되었다. 퍼피는 종이에서 각 윷을 어느 팀이 던졌는지 적어 둔 부분까지 물어뜯어 갔다. 남은 것은 던진 윷의 전체 목록과 순서뿐이고, 적힌 NN번은 모두 실제로 던진 것이다.

용이는 기억을 더듬어 말판을 복구했다. 복구한 말판이 종이에 남은 윷 목록과 순서에 맞는 상태인지 판정하라. 경기가 아직 진행 중인 상태와 마지막 던지기로 막 끝난 상태는 둘 다 맞는 상태로 본다. 판 위에 있는 말의 위치만 주어지고, 아직 출발하지 않은 말과 통과한 말이 각각 몇 개인지는 주어지지 않는다.

입력

첫 줄에 테스트 케이스의 수 TT가 주어진다.

각 테스트 케이스는 네 줄이다. 첫 줄에 정수 네 개 UU, NN, AA, BB가 공백으로 구분되어 주어진다. UU는 한 팀이 쓰는 말의 수, NN은 던진 윷의 개수, AA는 판 위에 있는 A 팀 말의 개수, BB는 판 위에 있는 B 팀 말의 개수다.

둘째 줄에 던진 윷 NN개가 던진 순서대로 공백으로 구분되어 주어진다. 각 윷은 Do, Gae, Gul, Yut, Mo 중 하나다.

셋째 줄에 A 팀 말의 위치 AA개가, 넷째 줄에 B 팀 말의 위치 BB개가 공백으로 구분되어 주어진다. 개수가 0이면 그 줄은 비어 있다. 같은 칸에 업힌 말이 있으면 그 칸 번호가 말의 개수만큼 나온다.

제한

  • 1≤T≤501 \le T \le 50
  • 1≤U≤21 \le U \le 2
  • 1≤N≤201 \le N \le 20
  • 0≤A≤U0 \le A \le U, 0≤B≤U0 \le B \le U
  • 말의 위치는 0 이상 28 이하다.

출력

각 테스트 케이스마다 Case #x: y 형식으로 한 줄씩 출력한다. xx는 1부터 시작하는 테스트 케이스 번호고, yy는 판정 결과다. 주어진 윷 목록과 순서로 만들 수 있는 말판이면 YES를, 아니면 NO를 출력한다.

예제3

  1. 예제 1

    입력
    7
    1 5 1 1
    Do Gae Gul Do Gae
    6
    3
    1 2 1 1
    Gae Gae
    2
    2
    1 2 0 1
    Gae Gae
    
    2
    1 6 1 0
    Do Mo Mo Mo Mo Gae
    1
    
    1 5 1 1
    Mo Gul Gul Do Gul
    27
    6
    2 5 2 1
    Do Gul Do Gae Gae
    1 3
    5
    2 3 2 1
    Do Gae Gul
    1 3
    2
    
    예상 출력
    Case #1: YES
    Case #2: NO
    Case #3: YES
    Case #4: NO
    Case #5: YES
    Case #6: NO
    Case #7: YES
    
  2. 예제 2

    입력
    5
    1 1 1 0
    Do
    1
    
    1 1 0 0
    Do
    
    
    1 1 1 0
    Mo
    5
    
    1 1 0 1
    Gae
    
    2
    1 2 1 0
    Yut Do
    5
    
    
    예상 출력
    Case #1: YES
    Case #2: NO
    Case #3: YES
    Case #4: NO
    Case #5: YES
    
  3. 예제 3

    입력
    7
    1 2 1 0
    Mo Gul
    22
    
    1 3 1 0
    Mo Mo Do
    15
    
    1 4 1 0
    Mo Mo Mo Do
    0
    
    1 2 1 0
    Mo Gae
    21
    
    1 4 1 1
    Mo Gul Do Do
    27
    1
    1 3 1 1
    Mo Do Do
    20
    1
    1 3 1 0
    Mo Mo Do
    22
    
    
    예상 출력
    Case #1: YES
    Case #2: YES
    Case #3: YES
    Case #4: YES
    Case #5: YES
    Case #6: YES
    Case #7: NO