아직 만들고 있는 페이지입니다.

이 페이지는 아직 만드는 중입니다. 보이는 내용은 바뀔 수 있습니다.

자동차 트라이얼

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

요약
각 줄을 소문자·대문자를 구분하는 작은 문법에 맞춰 분석해 올바른 카 트라이얼 지시문인지 판정하고, 맞으면 공백을 하나로 줄여 출력하며 틀리면 Trap!을 출력한다.
난이도

보통10점 중 6점

유형
문자열, 구현, 재귀, 완전 탐색
정답자
아직 제출이 없습니다

문제

자동차 트라이얼(car trialling)은 운전자가 매우 정밀하게 작성된 지시문을 그대로 따라야 하는 모터스포츠이다. 대회를 설계할 때 주최자는 방심한 참가자를 걸려들게 하려고 지시문 곳곳에 일부러 "함정"을 심어 둔다.

아래 규칙을 지키는 지시문인지 판정하는 프로그램을 작성하라. 이 규칙은 실제 자동차 트라이얼 지시문을 느슨하게 본떠 만든 것이다.

문법 표기법은 다음과 같다.

  • 대문자로 쓴 단어(예: GO, KEEP, RIGHT)는 그대로 나타나야 하는 리터럴 문자열이며, 대소문자를 구분한다.
  • 소문자 이름은 문법 규칙이다.
  • |는 선택지를 구분하며, 그중 정확히 하나를 골라야 한다.
  • ..는 범위를 펼친 것으로, A..D는 A | B | C | D와 같다.
instruction   = navigational | time-keeping | navigational AND time-keeping
navigational  = directional | navigational AND THEN directional
directional   = how direction | how direction where
how           = GO | GO when | KEEP
direction     = RIGHT | LEFT
when          = FIRST | SECOND | THIRD
where         = AT sign
sign          = "signwords"
signwords     = s-word | signwords s-word
s-word        = letter | s-word letter
letter        = A..Z | .
time-keeping  = record | change
record        = RECORD TIME
change        = cas TO nnn KMH
cas           = CHANGE AVERAGE SPEED | CAS
nnn           = digit | nnn digit
digit         = 0..9

s-word와 nnn은 각각 글자와 숫자가 공백 없이 이어진 것이다. 이웃한 항목 사이에는 하나 이상의 공백이 있으나, 다음 세 경우에는 공백이 전혀 없다: 마침표(.) 바로 앞, 여는 큰따옴표(") 바로 뒤, 닫는 큰따옴표(") 바로 앞.

입력

입력은 한 줄에 하나씩 여러 개의 지시문으로 이루어진다. 각 줄의 길이는 최대 75자이다. 입력은 문자 # 하나만 있는 줄로 끝나며, 이 줄은 지시문이 아니므로 처리하지 않는다.

출력

각 지시문 줄마다 번호가 매겨진 줄을 하나씩 출력한다. 줄 번호는 1부터 차례로 매긴다.

각 출력 줄은 너비 3칸에 오른쪽 정렬한 줄 번호로 시작하고, 이어서 마침표(.)와 공백 한 칸을 붙인다. 그다음에는

  • 지시문이 올바르면 지시문 자체를 출력하되, 공백이 둘 이상 이어진 구간은 모두 공백 한 칸으로 줄인다.
  • 그렇지 않으면 Trap!을 출력한다.

예제4

  1. 예제 1

    입력
    KEEP LEFT AND THEN GO RIGHT
    CAS TO 20 KMH
    GO FIRST       RIGHT AT "SMITH ST."  AND   CAS TO 20 KMH
    GO 2nd RIGHT
    GO LEFT AT "SMITH STREET AND RECORD TIME
    KEEP RIGHT AND THEN RECORD TIME
    #
    
    예상 출력
      1. KEEP LEFT AND THEN GO RIGHT
      2. CAS TO 20 KMH
      3. GO FIRST RIGHT AT "SMITH ST." AND CAS TO 20 KMH
      4. Trap!
      5. Trap!
      6. Trap!
    
  2. 예제 2

    입력
    GO RIGHT
    #
    
    예상 출력
      1. GO RIGHT
    
  3. 예제 3

    입력
    KEEP LEFT
    RECORD TIME
    CHANGE AVERAGE SPEED TO 100 KMH
    GO SECOND LEFT AT "A.B.C" AND RECORD TIME
    #
    
    예상 출력
      1. KEEP LEFT
      2. RECORD TIME
      3. CHANGE AVERAGE SPEED TO 100 KMH
      4. GO SECOND LEFT AT "A.B.C" AND RECORD TIME
    
  4. 예제 4

    입력
    GO FIRST LEFT AT "N" AND THEN KEEP RIGHT AND THEN GO RIGHT AT "MAIN ST." AND CAS TO 5 KMH
    #
    
    예상 출력
      1. GO FIRST LEFT AT "N" AND THEN KEEP RIGHT AND THEN GO RIGHT AT "MAIN ST." AND CAS TO 5 KMH