메시지 변환기
시간 제한1초메모리 제한128 MB
개행, 정렬, 자간 태그가 포함된 MULTI 마크업 문자열을 해석해 고정 크기 격자에 렌더링하고 충돌, 크기, 문법 오류를 판별하는 문제입니다.
문제
NTCIP(National Transportation Communications for ITS Protocol)는 고속 통신에서 메시지를 표현하기 위해 MULTI(Markup Language for Transportation Information) 문자열을 사용한다. MULTI 문자열은 출력할 문자와 출력 형식을 바꾸는 태그로 이루어진다. 태그는 [로 시작해 ]로 끝난다. 문자 [ 자체를 출력하려면 [[를 쓰고, 문자 ] 자체를 출력하려면 ]]를 쓴다. 출력되는 각 문자는 배열의 한 칸을 차지한다.
사용할 수 있는 태그는 다음과 같다.
행의 너비가 24칸일 때의 렌더링은 다음과 같다. □는 빈 칸을 뜻한다.
태그는 대소문자를 구분하지 않는다. 예를 들어 [nl], [NL], [Nl], [nL]은 모두 같다.
초기 정렬은 왼쪽 정렬이고, 문자 사이 추가 공백 수는 0이다. 현재 정렬과 추가 공백 수는 [nl] 뒤에도 유지된다.
다음 경우에는 TAG CONFLICT 오류가 발생한다.
[jl2]또는[jl5]를 현재 행에 이미 출력된 문자가 있을 때 사용한 경우[jl5]가 현재 행에서 사용된 뒤 다른 정렬 태그를 사용한 경우- 현재 행에서 오른쪽 정렬 텍스트가 출력된 뒤
[jl3]을 사용한 경우
같은 정렬 태그를 다시 사용하는 것은 충돌이 아니다. 양쪽 정렬에서는 [sc<digit>]와 [/sc]가 무시된다.
한 행에 필요한 칸 수가 너무 많거나, 출력에 필요한 행 수가 너무 많으면 TOO BIG 오류가 발생한다. 왼쪽 정렬과 가운데 정렬, 가운데 정렬과 오른쪽 정렬, 왼쪽 정렬과 오른쪽 정렬이 한 행에 함께 있으면 두 영역 사이에 적어도 한 칸의 공백이 남아야 하며, 그렇지 않으면 TOO BIG이다.
[nl]은 그 뒤에 실제로 출력되는 문자가 나오기 전까지 행을 넘기지 않는다. 허용된 태그가 아닌 태그, 잘못된 태그 형식, 짝이 맞지 않는 괄호는 모두 BAD TAG 오류이다.
MULTI 문자열을 읽어 올바른 메시지 또는 오류 메시지를 출력하는 프로그램을 작성하시오.
입력
첫 줄에 데이터 세트의 수 N이 주어진다. 1 <= N <= 100이다.
이후 N개의 줄에 각각 하나의 데이터 세트가 주어진다. 각 줄은 행 수 R, 열 수 C, 그리고 MULTI 문자열로 이루어진다. 1 <= R <= 25, 1 <= C <= 80이며, MULTI 문자열은 C 뒤에 남은 줄 전체이다.
출력
각 데이터 세트마다 먼저 데이터 세트 번호를 한 줄에 출력한다. 오류가 없으면 그 다음 R개의 줄에 변환된 메시지를 출력한다. 각 메시지 줄은 정확히 C개의 문자여야 한다.
오류가 있으면 메시지 줄 대신 TAG CONFLICT, TOO BIG, BAD TAG 중 해당 오류 메시지 하나를 출력한다. 각 데이터 세트의 출력 뒤에는 빈 줄을 하나 출력한다. 채점 데이터에서 오류가 있는 데이터 세트는 한 종류의 오류만 포함한다.