일본 플로터 드라이버

면접 대비

시간 제한1초메모리 제한128 MB

요약
POINT, TEXT, LINE, CLEAR, PRINT 명령을 ASCII 격자에서 실행하고, 겹친 문자를 정해진 규칙으로 합쳐 각 그림을 테두리와 함께 출력한다.
난이도

보통10점 중 7점

유형
시뮬레이션, 구현, 행렬, 수학
정답자
아직 제출이 없습니다

문제

당신이 근무하는 회사는 멋진 그림을 그릴 수 있는 플로터(plotter) 장치를 생산합니다. 특수 하드웨어가 없는 고객을 위해, 플로터의 동작을 흉내 내어 그 그림을 화면에 출력하는 에뮬레이션 드라이버를 작성해야 합니다.

플로터는 다음 몇 가지 그리기 명령으로 구동됩니다.

  • POINT x y — 주어진 좌표에 작은 원을 찍습니다.
  • TEXT x y txt — 주어진 좌표에 한 줄의 문자열을 표시합니다.
  • LINE x1 y1 x2 y2 — 지정한 두 점 사이에 선을 그립니다.
  • CLEAR x1 y1 x2 y2 — 지정한 직사각형 영역을 지웁니다.
  • PRINT — 출력 페이지를 인쇄하고 현재 작업을 종료합니다.

에뮬레이션 드라이버는 몇 개의 ASCII 문자로 그림을 표현하며, 문자 하나가 좌표계의 기본 단위입니다. 왼쪽 위 문자의 좌표는 (1, 1)이고, X축은 오른쪽, Y축은 아래쪽을 향합니다.

각 명령은 다음과 같이 처리됩니다.

  • POINT: 주어진 좌표에 소문자 o를 찍습니다.
  • TEXT: 한 줄의 문자열을 표시하며, 첫 글자가 주어진 좌표에 놓이고 문자열은 항상 오른쪽으로 이어집니다.
  • LINE: 두 점 사이의 직선을 흉내 냅니다. 선은 방향에 따라 대시(-), 파이프(|), 슬래시(/), 백슬래시(\) 중 하나의 문자로 이루어집니다.
  • CLEAR: 경계가 되는 행과 열을 포함하여 해당 직사각형 영역을 공백으로 채웁니다.
  • PRINT: 그림을 플러스(+), 마이너스(-), 파이프(|) 문자로 만든 테두리로 감싸 인쇄합니다.

한 문자 위에 여러 대상이 겹쳐 그려질 때는 다음 규칙을 따릅니다.

  • 같은 문자가 여러 번 그려지면, 그대로 사용합니다.
  • 파이프와 마이너스 문자만 관여하면, 플러스(+)가 됩니다.
  • 슬래시와 백슬래시만 관여하면, 소문자 x가 됩니다.
  • 그 외의 경우에는 별표(*)가 표시됩니다.

드라이버에 스크립트가 주어지기 전, 특별한 전처리기가 모든 잘못된 명령을 걸러 냅니다. 따라서 모든 좌표는 페이지 범위 안에 있다고 가정할 수 있습니다. 또한 LINE 명령에서 두 점은 항상 서로 다르며, 선은 반드시 수직, 수평, 또는 두 축에 대해 45° 각도 중 하나입니다. LINE과 CLEAR 명령에서 두 점의 상대적 위치에 대한 가정은 없습니다. TEXT 명령의 문자열은 항상 대문자와 숫자로만 이루어집니다.

입력

입력은 여러 개의 스크립트로 이루어집니다. 각 스크립트는 공백으로 구분된 두 정수 X와 Y가 있는 줄로 시작하며(1≤X,Y≤751 \le X, Y \le 75), 이 값은 페이지의 크기를 나타냅니다. 이후의 각 줄에는 위 명령 중 정확히 하나가 담깁니다. 명령은 항상 대문자이고, 명령의 인자들은 하나의 공백으로 구분됩니다.

PRINT 명령은 항상 스크립트의 마지막 명령입니다. PRINT 뒤에는 새로운 스크립트가 시작됩니다. 입력은 두 개의 0으로 끝나며, 이는 스크립트로 간주하지 않습니다.

출력

각 스크립트에 대해 위에서 설명한 대로 만들어진 그림을 출력합니다. 서로 이웃한 두 그림 사이에는 빈 줄 하나를 둡니다.

예제1

  1. 예제 1

    입력
    20 10
    LINE 3 2 11 10
    LINE 3 10 11 2
    LINE 20 3 8 3
    TEXT 6 8 TEST
    LINE 19 1 19 10
    LINE 17 10 17 1
    LINE 16 1 16 10
    LINE 13 6 20 6
    CLEAR 20 5 15 7
    LINE 18 1 18 10
    TEXT 12 10 NICEPICTURE
    POINT 1 1
    POINT 3 2
    PRINT
    1 1
    POINT 1 1
    CLEAR 1 1 1 1
    PRINT
    3 3
    LINE 2 1 2 3
    LINE 1 2 3 2
    LINE 2 3 2 1
    LINE 3 2 1 2
    LINE 2 1 2 3
    LINE 1 2 3 2
    PRINT
    0 0
    
    예상 출력
    +--------------------+
    |o              |||| |
    |  *       /    |||| |
    |   \   --*-----++++-|
    |    \   /      |||| |
    |     \ /         |  |
    |      x     --   |  |
    |     / \         |  |
    |    /TES*      |||| |
    |   /     \     |||| |
    |  /       \NICE****U|
    +--------------------+
    
    +-+
    | |
    +-+
    
    +---+
    | | |
    |-+-|
    | | |
    +---+