멀티스레드 프로그램
면접 대비시간 제한2초메모리 제한512 MB
스레드별 대입 순서와 변수의 최종 값이 주어질 때, 모든 대입을 실행해 그 값을 만족하는 실행 순서가 있는지 판단하고, 있으면 그중 하나를 출력합니다.
문제
모리스는 낡은 컴퓨터에서 멀티스레드 프로그램을 디버깅하고 있다. 프로그램에는 공유 변수 집합을 조작하는 여러 스레드가 있다. 각 스레드는 미리 정해진 프로그램 순서대로 자신의 대입문 시퀀스를 실행한다. 각 대입문은 변수 하나를 정수 값으로 설정한다.
프로그램을 실행할 때 서로 다른 스레드의 대입문은 어떤 순서로든 실행될 수 있다. 보장되는 것은 각 스레드가 자신의 모든 대입문을 프로그램 순서대로 실행한다는 것뿐이다.
예를 들어 프로그램에 대입문이 각각 , , 개인 스레드 세 개가 있다고 하자. 그러면 한 가지 올바른 실행은 다음과 같다.
- 스레드 이 자신의 시퀀스에서 첫 번째 대입문을 실행한다.
- 스레드 가 자신의 시퀀스에서 첫 번째 대입문을 실행한다.
- 스레드 가 자신의 시퀀스에서 두 번째 대입문을 실행한다.
- 스레드 이 자신의 시퀀스에서 두 번째 대입문을 실행한다.
- 스레드 이 자신의 시퀀스에서 유일한 대입문을 실행한다.
이 실행은 으로 나타낼 수 있다. 여기서 숫자는 각 대입문을 수행하는 스레드를 순서대로 나타낸다. 다른 올바른 실행도 많이 존재한다.
모리스는 자신의 컴퓨터가 고장 나서 잘못 동작할 수 있다고 의심한다. 그는 프로그램을 실행한 뒤 모든 변수의 최종 값을 기록했다.
모든 대입문을 수행하고 기록된 모든 변수 값을 만드는 프로그램 실행을 찾거나, 컴퓨터가 실제로 고장 나서 그러한 실행이 존재하지 않는다고 보고하시오.
입력
첫 줄에는 정수 가 주어진다. 는 스레드의 수이다 (). 스레드는 부터 까지 번호가 매겨진다. 다음 줄들에는 스레드마다 하나씩, 개의 대입문 시퀀스가 주어진다.
번째 설명의 첫 줄에는 정수 가 주어진다. 는 번째 스레드의 대입문 시퀀스 길이이다 (). 이어지는 개의 줄 각각에는 <variable>=<value> 형식의 대입문이 주어진다. 대입문은 프로그램 순서대로 나열된다. 변수 이름은 길이가 최대 인 영문 소문자로 이루어지고, 값은 이하의 양의 정수이다.
나머지 줄의 첫 줄에는 정수 가 주어진다. 는 변수의 수이다 (). 이어지는 개의 줄 각각에는 변수 이름과 기록된 값이 주어지며, 값은 이하의 양의 정수이다. 프로그램에서 사용되는 각 변수는 정확히 한 번 나열되고, 나열된 각 변수는 적어도 하나의 대입문에서 사용된다.
출력
기록된 값을 만드는 실행이 존재하면 Yes를 출력하고, 그렇지 않으면 No를 출력한다.
실행이 존재하면 개의 정수 를 한 줄에 출력한다. 이 정수들은 그러한 실행 하나를 나타낸다 (). 첫 번째 대입문은 스레드 이, 두 번째 대입문은 스레드 가 수행한다는 식이다. 각 스레드는 자신의 대입문을 프로그램 순서대로 수행한다. 번째 대입문이 끝난 뒤 각 변수는 기록된 값을 가져야 한다. 번째 스레드는 출력에서 정확히 번 나타나야 한다.