각 값이 인자 변수에 의존하는 대입문들이 있을 때 모든 의존성을 해결하는 평가 순서가 존재하는지 판정한다.
보통4그래프위상 정렬DFS아직 제출이 없습니다시간 제한5초메모리 제한512 MB순서가 정해지지 않은 대입문 목록이 주어진다. 모든 대입문을 평가할 수 있는 순서가 존재하는지 판정하는 프로그램을 작성한다.
대입문은 대입 변수, 대입 연산자, 식이 이 순서대로 이어진 형태다. 대입문은 직접 정한 순서대로 하나씩 평가한다. 변수는 앞선 대입문의 대입 변수로 이미 나온 경우에만 평가할 수 있다.
모든 식은 함수 호출 하나다. 함수는 인자를 0개 이상 몇 개든 받는다. 인자가 없는 호출은 항상 유효하고, 인자가 있는 호출은 인자로 쓰인 변수를 모두 평가할 수 있을 때 유효하다.
다음 대입문 목록을 보자.
a=f(b,c)
b=g()
c=h()
아래 순서라면 모든 대입문이 유효하다.
b=g()
c=h()
a=f(b,c)
g()와 h()는 어떤 변수에도 의존하지 않으므로 b와 c를 먼저 평가하고, f(b,c)가 의존하는 b와 c가 그때는 이미 평가되었으므로 a가 뒤따른다.
반면 아래 순서는 유효하지 않다.
b=g()
a=f(b,c)
c=h()
f(b,c)가 인자로 c를 받는데 c는 아직 대입 변수로 나온 적이 없기 때문이다.
또 다른 예는 a=f(a)다. 식 f(a)가 같은 대입문이 대입하는 변수 a에 의존하므로 어떤 순서로도 평가할 수 없다.
첫째 줄에 테스트 케이스의 수 T가 주어진다. 이어서 T개의 테스트 케이스가 주어진다. 각 테스트 케이스의 첫째 줄에는 대입문의 개수 N이 주어지고, 다음 N개 줄에 대입문이 한 줄에 하나씩 주어진다.
각 대입문은 대입 변수, 대입 연산자, 식이 공백 없이 이어진다. 대입 연산자는 항상 =다. 식은 함수 이름, (, 쉼표로 구분한 변수 이름 0개 이상, )가 차례로 이어진 형태다. 변수 이름과 함수 이름은 소문자 영어 알파벳으로만 이루어진다. 함수와 이름이 같은 변수는 없다. 같은 변수가 대입 변수로 두 번 이상 나오지 않는다. 반면 인자로는 같은 변수가 여러 번 나올 수 있고 한 호출 안에서 여러 번 나올 수도 있으며, 같은 함수 이름이 여러 대입문에 나올 수도 있다.
각 테스트 케이스마다 Case #x: y 형식으로 한 줄씩 출력한다. x는 1부터 시작하는 테스트 케이스 번호이고, y는 모든 대입문을 평가하는 순서가 있으면 GOOD, 없으면 BAD다.