재우는 결국 지난 <제2회 고려대학교 MatKor Cup: 2023 Winter> 대회의 수영 과목에서 F를 막지 못했다. 이에 절치부심하여 이번 학기의 볼링 수업에서는 반드시 Pass를 받기로 다짐했다. 볼링은 10개의 프레임으로 이루어져 있다. 볼링의 규칙과 점수 계산 방식은 다음과 같다.
<규칙>
프레임은 1번 프레임부터 10번 프레임까지 순서대로 진행한다.
각 프레임이 시작될 때 10개의 핀이 내려온다.
1번부터 9번 프레임은 최대 두 번의 투구(投球)가 이루어진다.
만약 첫 번째 투구에서 10개의 핀을 모두 넘어뜨리면 스트라이크가 되고, 두 번째 투구를 하지 않는다.
첫 번째 투구에서 모두 넘어뜨리지 못했을 경우 남은 핀들로 두 번째 투구를 진행한다.
10번 프레임은 최대 3번의 투구를 한다.
첫 번째 투구에 스트라이크를 치거나 두 번째 투구에 스페어를 치면 세 번째 투구를 할 수 있으며, 세 번째 투구 이후에는 경기가 종료된다.
또한 스페어나 스트라이크를 치는 즉시 10개의 핀이 초기화 되어 내려온다.
마지막 프레임의 세 번째 투구 이후에는 남은 핀에 관계 없이 경기가 종료된다.
10개를 모두 넘어뜨렸을 때 스트라이크와 스페어의 구분은 해당 투구 직전 10개의 핀이 내려왔다면 스트라이크, 해당 투구 직전 투구 이후 핀이 내려오지 않았다면 스페어다.
<점수 계산 방식>
볼링의 점수 계산 방식은 프레임별로 얻은 점수의 총합이다.
각 프레임에서 얻은 점수는 “핀 점수”와 “보너스 점수”의 합이다.
핀 점수는 해당 프레임의 모든 투구에서 넘어진 핀 개수의 총합이다.
보너스 점수는 10번 프레임에는 존재하지 않으며, 1번부터 9번 프레임까지에 대해서도 해당 프레임에 스페어나 스트라이크를 쳤을 경우만 보너스 점수가 존재한다.
재우가 볼링 수업에서 Pass를 받기 위해 스코어보드 사진을 찍어 가야 한다고 한다. 재우가 사진을 찍을 때 사진이 흔들리는 바람에 일부 점수가 보이지 않는다. 스코어보드에는 투구별 결과가 적혀있다.
각 투구 결과와 프레임별 점수 중 일부가 주어질 때, 최종적으로 M점이 되는 경우의 수를 109+7로 나눈 나머지를 구해보자. 스코어보드에 표시되는 결과가 하나라도 다른 경우 다른 경우의 수로 센다.
첫 줄에 1번부터 10번 프레임에 대해 한 줄에 한 프레임씩 각 투구의 정보가 아래 방식으로 길이 21의 문자열 하나로 주어진다. 이때, 10번 프레임의 세 번의 투구는 스코어보드에서 모두 투구 내용이 보인다. 즉, 마지막 세 문자는 ?가 아니다.
스코어보드에서 투구의 내용이 보이지 않을 때 : ?
스코어보드에서 투구의 내용이 보일 때
X/.-만약 투구에 대한 정보로 가능한 경우가 겹치면, 더 위의 정보를 준다. 예를 들어 두 번째 투구에서 남아 있는 2개의 핀을 넘겨 스페어 처리한 경우 2가 아닌 /가 주어진다.
다음 줄에 경우의 수를 구하고 싶은 점수의 개수 S=221가 주어진다.
다음 줄에 점수를 검사하고 싶은 점수 M_i=i(i=0,1,2,⋯,S)가 순서대로 공백으로 구분되어 주어진다.
예제의 입력은 S=221이며 M_i=i이나, 이는 단순 사용자 테스트용으로 채점되지 않는다. 실제 입력은 S=221이며 M_i=i인 경우만 주어진다.
첫 줄에 M=M_0(=0) 부터 M=M_S(=S−1=220)점 까지 해당 스코어 보드에서 최종적으로 M점이 되는 경우의 수를 109+7로 나눈 나머지를 공백으로 구분하여 출력한다.
주어진 스코어보드가 불가능한(M점이 되는 경우의 수가 0인 것과는 다르다) 경우는 주어지지 않는다.
예제의 입력은 S=221이며 M_i=i이나, 실제 입력은 S=221이며 M_i=i이므로, 사용자가 제출할 때는 221개의 정수를 출력해야 한다.