페이지를 불러오는 중…
해결한 사람
1
명
정답률
100.00
%
시간 제한
30000
ms
메모리 제한
1024
MB
순서가 정해지지 않은 대입문 목록이 주어질 때, 모든 변수를 평가할 수 있도록 대입문들을 어떤 순서로 배열할 수 있는지 판별하는 프로그램을 작성한다.
이 문제에서 대입문은 순서대로 대입 변수, 대입 연산자, 표현식으로 이루어진다. 문장은 선택한 순서대로 한 번에 하나씩 평가한다. 어떤 변수가 이전 대입문의 대입 변수였을 때, 그리고 그럴 때에만 그 변수를 평가할 수 있다.
문제를 단순화하기 위해 모든 표현식은 단일 함수 호출이다. 함수는 인수를 하나도 포함하지 않는 경우를 비롯해 임의 개수의 인수를 받을 수 있다. 인수가 없는 함수는 항상 유효하며, 변수를 인수로 갖는 함수는 그 변수들을 모두 평가할 수 있는 한 유효하다.
예를 들어 다음 대입문 목록을 보자.
a=f(b,c) b=g() c=h()
다음은 모든 문장을 유효하게 만드는 한 가지 순서이다.
b=g() c=h() a=f(b,c)
그 이유는 다음과 같다. (1) 표현식 g()와 h()은 어떤 변수에도 의존하지 않으므로 b와 c를 평가할 수 있다. 또한 (2) 표현식 a은 평가할 수 있는 b와 c에 의존하므로 a도 평가할 수 있다.
하지만 다음 순서는
b=g() a=f(b,c) c=h()
유효하지 않다. f(b, c)은 변수 c를 인수로 갖지만, 변수 c가 아직 대입 변수로 사용되지 않았기 때문이다.
또 다른 예는 a=f(a)이다. 표현식 f(a)이 변수 a 자기 자신에 의존하여 해당 문장을 평가할 수 없으므로, 이 문장 목록은 평가할 수 없다.
1 ≤ T ≤ 20. 시간 제한: 테스트 세트당 30초. 메모리 제한: 1GB. 모든 함수는 양 끝을 포함하여 0개에서 10개 사이의 인수를 받는다. 모든 변수 이름은 1개에서 20개 사이의 영문 소문자로 이루어진다.
1 ≤ N ≤ 100.
1 ≤ N ≤ 1000.
입력의 첫 줄에는 테스트 케이스의 수 T가 주어진다. 이어서 T개의 테스트 케이스가 주어진다. 각 테스트 케이스의 첫 줄에는 대입문의 개수를 나타내는 정수 N이 주어진다. 이어서 N개의 줄이 주어지며, 각 줄에는 하나의 대입문이 있다.
각 대입문은 대입 변수, 대입 연산자, 표현식의 세 부분으로 이루어지며, 부분 사이에는 공백이 없다. 대입 연산자는 항상 =이다. 모든 표현식은 함수 이름, (, 쉼표로 구분된 없거나 그 이상의 변수 이름, ) 순으로 이루어진다. 모든 변수 이름과 함수 이름은 하나 이상의 영문 소문자로 이루어진다. 어떤 변수도 함수와 같은 이름을 갖지 않는다. 어떤 변수도 대입 변수로 두 번 이상 나타나지 않는다. 하지만 변수는 여러 함수에서 두 번 이상 나타날 수 있고 같은 함수 안에서도 그럴 수 있으며, 함수도 두 번 이상 나타날 수 있다.
각 테스트 케이스마다 Case #x: y을 포함하는 한 줄을 출력한다. 여기서 x는 1부터 시작하는 테스트 케이스 번호이고, y는 모든 변수를 평가할 수 있으면 GOOD, 그렇지 않으면 BAD이다.
4
3
a=f(b,c)
b=g()
c=h()
2
a=f(b)
b=f(a)
2
aaa=foo(x,y)
bbb=bar(aaa,bbb)
2
x=f()
y=g(x,x)Case #1: GOOD
Case #2: BAD
Case #3: BAD
Case #4: GOODCopyright Google LLC; sourced from the Google Coding Competitions Archive.
로그인 상태를 확인하는 중입니다.