각 식이 함수 호출인 대입문 목록이 주어질 때 모든 변수를 계산할 수 있는 순서가 있는지 판정한다. 의존 관계에 사이클이 있으면 불가능하다.
보통4그래프위상 정렬DFS구현면접 대비아직 제출이 없습니다시간 제한5초메모리 제한1024 MB순서가 정해지지 않은 대입문 목록이 주어진다. 모든 변수를 평가할 수 있는 순서로 대입문을 배열할 수 있는지 판별하는 프로그램을 작성하라.
이 문제에서 대입문은 대입 변수, 대입 연산자, 식이 이 순서로 이어진 것이다. 대입문은 여러분이 정한 순서대로 한 번에 하나씩 평가한다. 어떤 변수는 앞선 대입문의 대입 변수로 쓰인 적이 있을 때만 평가할 수 있다.
문제를 단순하게 하려고 모든 식은 함수 호출 하나로만 이루어진다. 함수는 인자를 몇 개든 받으며 인자가 없을 수도 있다. 인자가 없는 함수 호출은 언제나 유효하고, 인자가 있는 함수 호출은 인자로 쓰인 변수를 모두 평가할 수 있을 때만 유효하다.
예를 들어 다음 대입문 목록을 보자.
a=f(b,c)
b=g()
c=h()
다음 순서로 놓으면 모든 대입문이 유효하다.
b=g()
c=h()
a=f(b,c)
이유는 두 가지다. g()와 h()는 어떤 변수에도 의존하지 않으므로 b와 c를 평가할 수 있다. a의 식은 b와 c에 의존하는데 둘 다 평가할 수 있으므로 a도 평가할 수 있다.
반면 다음 순서는 유효하지 않다.
b=g()
a=f(b,c)
c=h()
f(b,c)가 변수 c를 인자로 받지만, 이 시점에 c는 아직 어떤 대입문의 대입 변수로도 쓰이지 않았기 때문이다.
또 다른 예는 a=f(a)이다. 식 f(a)가 변수 a 자신에 의존하므로 이 대입문은 평가할 수 없다.
첫 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스의 첫 줄에는 대입문의 개수 N이 주어지고, 이어지는 N개의 줄에 대입문이 한 줄에 하나씩 주어진다.
각 대입문은 대입 변수, 대입 연산자, 식 세 부분으로 이루어지며 사이에 공백이 없다. 대입 연산자는 항상 =이다. 모든 식은 함수 이름, (, 쉼표로 구분된 변수 이름 0개 이상, )가 이 순서로 이어진 형태다. 모든 변수 이름과 함수 이름은 영어 소문자로만 이루어지며 길이가 1 이상이다. 변수 이름이 함수 이름과 같은 경우는 없다. 한 변수가 대입 변수로 두 번 이상 나오지는 않는다. 다만 같은 변수가 여러 함수 호출에 나올 수 있고 한 함수 호출 안에 여러 번 나올 수도 있으며, 같은 함수가 여러 번 나올 수도 있다.
각 테스트 케이스마다 Case #x: y 형식으로 한 줄씩 출력한다. x는 1부터 시작하는 테스트 케이스 번호이고, y는 모든 변수를 평가할 수 있으면 GOOD, 그렇지 않으면 BAD이다.