이런 문제는 유치원생도 해결할 수 있어
면접 대비시간 제한2초메모리 제한128 MB
주어진 문법에서 중괄호와 쉼표가 구분자이면서 동시에 원소가 될 수 있을 때, 각 문자열이 올바른 집합인지 판별한다.
문제
도영이는 자신이 매우 똑똑하다고 생각한다. 동진이는 그런 도영이의 콧대를 꺾으려고 문제 하나를 준비했다.
- 동진이가 물었다. "집합의 문법을 나에게 설명해 줄 수 있어?"
- 도영이가 답했다. "당연하지! 집합은 두 개의 꺾쇠 괄호
{ }로 둘러싸인 리스트를 뜻해. 리스트는 비어 있을 수도 있고, 원소로 다른 집합이나 주어진 알파벳의 한 글자를 가질 수 있어." - "그럼 내가 어떤 문자열을 주면, 그게 문법적으로 집합이 맞는지 판별할 수 있어?"
- "당연하지, 이런 문제는 유치원생도 해결할 수 있어."
동진이는 집합의 문법을 다음과 같이 정의했다. (이것은 실제 집합의 정의가 아니라, 도영이를 골탕 먹이려고 만든 것일 뿐이다.)
Set ::= "{" Elementlist "}"
Elementlist ::= <empty> | List
List ::= Element | Element "," List
Element ::= Atom | Set
Atom ::= "{" | "}" | ","
여기서 \<empty>는 리스트가 비어 있을 수도 있음을 의미한다.
핵심은, 원소로 쓸 수 있는 알파벳 한 글자가 하필 문법에서 중요한 역할을 하는 기호 {, }, ,와 똑같다는 점이다. 이 겹침 때문에 어떤 문자열이 집합인지 판별하는 일은 생각보다 까다롭다. 위 문법에 따라 주어진 문자열이 올바른 집합인지 효율적으로 판별하는 프로그램을 작성하라.
입력
첫째 줄에 판별할 문자열의 개수 이 주어진다.
둘째 줄부터 개의 줄에 걸쳐, 문법적으로 집합인지 판별해야 하는 문자열이 한 줄에 하나씩 주어진다. 각 문자열의 길이는 이상 이하이며, 오직 {, }, , 세 문자로만 이루어져 있다.
출력
각 문자열에 대해 한 줄씩 출력한다. 번째(는 부터 시작한다) 문자열이 문법적으로 집합이면 Word #i: Set을, 집합이 아니면 Word #i: No Set을 출력한다.