행렬 시프트
시간 제한5초메모리 제한512 MB
중첩 반복이 있는 압축된 시프트 명령 문자열을 해석해 N×N 행렬의 행과 열 회전을 적용한 뒤 결과를 출력한다.
문제
행렬 가 주어진다. 처음 값은 이고, 는 번째 행 번째 열의 원소다. 행 번호와 열 번호는 1부터 센다.
이 행렬에는 네 가지 이동 연산을 적용한다.
- 에 대한 왼쪽 이동은 번째 행을 왼쪽으로 한 칸 회전한다. 인 에 대해 이전 가 새 이 되고, 이전 은 새 이 된다.
- 에 대한 오른쪽 이동은 번째 행을 오른쪽으로 한 칸 회전한다. 인 에 대해 이전 가 새 이 되고, 이전 은 새 이 된다.
- 에 대한 위쪽 이동은 번째 열을 위로 한 칸 회전한다. 인 에 대해 이전 가 새 가 되고, 이전 는 새 가 된다.
- 에 대한 아래쪽 이동은 번째 열을 아래로 한 칸 회전한다. 인 에 대해 이전 가 새 가 되고, 이전 는 새 가 된다.
연산 순서는 문자열 하나로 주어지며, 문자열의 왼쪽부터 오른쪽으로 차례대로 적용한다. 왼쪽, 오른쪽, 위쪽, 아래쪽 이동은 각각 문자 'L', 'R', 'U', 'D'로 쓰고, 문자 바로 뒤에 오는 수가 이동할 행이나 열의 번호다. 예를 들어 "R25"는 25에 대한 오른쪽 이동이다. 이 표기법은 반복도 지원한다. 괄호로 묶인 연산 순서 뒤에 수 이 오면 그 순서를 정확히 번 반복한다. 예를 들어 "(L1R2)10"은 1에 대한 왼쪽 이동과 2에 대한 오른쪽 이동을 이 순서대로 묶어 10번 반복한다.
주어지는 연산 순서는 모두 다음 문법을 따른다.
<sequence> := <sequence><repetition> | <sequence><operation> | <repetition> | <operation>
<repetition> := '('<sequence>')'<number>
<operation> := <shift><number>
<shift> := 'L' | 'R' | 'U' | 'D'
<number> := <nonzero_digit> | <number><digit>
<digit> := '0' | <nonzero_digit>
<nonzero_digit> := '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9'
과 연산 순서가 주어지면, 연산을 모두 적용한 뒤의 행렬을 구하는 프로그램을 작성하시오.
입력
입력은 테스트 케이스 하나로 이루어지며 형식은 다음과 같다.
N L
S
첫째 줄에 두 정수 과 이 주어진다. ()은 행렬의 크기이고, ()은 둘째 줄에 오는 문자열의 길이다. 둘째 줄에 연산 순서 가 주어지고, 는 위 문법을 따른다. 에 나오는 행 번호와 열 번호는 모두 1 이상 이하이며, 각 반복 횟수는 1 이상 이하다.
출력
개의 줄을 출력한다. 번째 줄에는 연산을 모두 적용한 뒤 의 번째 행에 있는 개의 정수를 공백 하나로 구분해 출력한다.