괄호

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

요약
C 산술 수식이 문법 오류인지, 괄호가 ICPC에서 필요 없는 괄호를 제외한 형태를 갖췄는지 판별해 결과를 출력합니다.
난이도

어려움10점 중 8점

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

문제

연산자와 피연산자의 대응 관계는 괄호로 명확하게 나타낼 수 있다. 예를 들어 C 프로그램에서 a-b-c는 뺄셈 연산자가 왼쪽 결합이므로 (a-b)-c로 명확하게 쓸 수 있다.

괄호는 연산자의 기본 우선순위와 결합 방향을 무시하도록 만들 수 있다. 예를 들어 a-(b-c)에서 뺄셈 연산자의 왼쪽 결합은 괄호 때문에 적용되지 않는다.

초보 C 프로그래머 Dennis는 연산자 우선순위와 결합 방향을 외우느라 스트레스를 너무 많이 받았다. 그래서 그는 ICPC(I can parenthesize C)라는 새 언어를 만들었다. 이 언어에서는 연산자와 피연산자의 대응 관계를 괄호로 완전히 명확하게 나타내야 하며, 그 점을 제외한 나머지 특징은 C와 같다. 예를 들어 a-b-c 대신 (a-b)-c를 써야 하고, a+b*c 대신 a+(b*c)를 써야 한다.

그런데 어떤 경우에는 괄호를 너무 많이 쓸 수 있다. a-b-c라는 식에는

(a-b)-c

라고 쓰면 충분하지만,

(a-(b))-c

나

((a-b)-c)

라고 쓸 수도 있는데, 밑줄 친 괄호 쌍은 불필요하다.

Dennis는 C 식을 괄호가 정확히 필요한 만큼만 쓰인 ICPC 식으로 바꾸고 싶어 한다. Dennis를 도와야 한다. 단순화를 위해 입력 C 식에는 이항 산술 연산자 다섯 개(+, -, *, /, %), 왼쪽 괄호와 오른쪽 괄호 (와 ), 그리고 알파벳 소문자 하나로 된 피연산자만 들어 있다고 가정한다. 이런 C 식이 주어질 때, 그 식이 ICPC 식인지 아닌지 판별하는 프로그램을 작성하시오.

ICPC에서 오류가 아닌 식이라면 C에서도 오류가 아니어야 한다. C에서 오류가 아니면 괄호 사용을 검사하여 ICPC에서 올바른 식인지 판별한다. 괄호가 제대로 쓰이지 않았을 때, 즉 괄호의 개수가 필요한 만큼 정확하지 않으면 부적절하다고 본다.

입력으로 주어지는 C 식 중 일부는 처음부터 잘못된 식일 수 있다. 예를 들어 a%/b는 %와 / 사이에 피연산자가 하나 더 있어야 유효하므로 오류다. 또 다른 예로 a b + c는 a와 b 사이에 연산자가 하나 더 있어야 하므로 역시 오류다.

입력

프로그램은 표준 입력에서 읽는다. 입력은 C 식을 담은 한 줄이다. 식은 알파벳 소문자 하나로 된 문자, 왼쪽 괄호와 오른쪽 괄호 및 이항 산술 연산자 다섯 개(+, -, *, /, %)를 포함한 특수 기호, 그리고 공백으로 이루어진 문자열이다. 입력 줄에는 피연산자가 적어도 하나 있다. 입력 줄의 길이(문자 수)는 공백과 끝의 줄바꿈 문자 하나를 포함해 1000을 넘지 않는다.

출력

프로그램은 표준 출력에 쓴다. 정확히 한 줄을 출력한다. 그 줄에는 error, proper, improper 중 하나가 들어가야 한다. 입력 C 식에 오류가 있으면 error를 출력한다. 오류가 아니면 식의 괄호 사용 상태에 따라 proper 또는 improper를 출력한다. ICPC에 필요한 만큼의 괄호가 정확히 쓰여 올바르면 proper를 출력하고, 그렇지 않으면 improper를 출력한다.

예제5

  1. 예제 1

    입력
    a + a
    
    예상 출력
    proper
    
  2. 예제 2

    입력
    (b+( a+c )) + b
    
    예상 출력
    proper
    
  3. 예제 3

    입력
    c + ((b) + a)
    
    예상 출력
    improper
    
  4. 예제 4

    입력
    c+(a%/b)
    
    예상 출력
    error
    
  5. 예제 5

    입력
    x + ((y + z)
    
    예상 출력
    error