내가 생각한 숫자는 무엇일까?
시간 제한2초메모리 제한512 MB
서로 다른 숫자로 이루어진 L자리 비밀 수에 대한 hit/blow 힌트가 주어질 때, 조건에 맞는 유일한 수를 찾거나 NO를 출력한다.
문제
내 머릿속에 L자리 숫자가 하나 있다 (4 <= L <= 10). 이 숫자가 무엇인지 맞혀야 한다. 숫자는 다음 열 가지 문자로 이루어진다.
"0","1","2","3","4","5","6","7","8", "9".
같은 숫자가 두 번 나오지 않는다. 예를 들어 L = 4일 때 "1234"는 가능한 후보지만 "1123"은 "1"이 두 번 나오므로 불가능하다.
숫자는 "0"으로 시작할 수 있으며, "05678"은 "5678"과 다른 숫자로 취급한다.
너와 네 컴퓨터가 텔레파시로 내 머릿속을 읽을 수 없다면, 내가 생각한 숫자를 알아내기 위해 힌트가 필요하다. 힌트는 try, hit, blow라는 세 숫자로 이루어진다.
try는 L자리 십진수다. try에도 같은 숫자가 두 번 나오지 않으며, 이 숫자도 "0"으로 시작할 수 있다.
hit은 try와 내가 생각한 숫자에 공통으로 들어 있으면서 위치까지 정확히 같은 숫자의 개수다.
blow는 try와 내가 생각한 숫자에 공통으로 들어 있지만 위치는 같지 않은 숫자의 개수다.
힌트는 다음과 같이 한 줄에 나열한다.
try hit blow
예를 들어 L = 4이고 내가 생각한 숫자가 9876이라면, 다음은 올바른 힌트들로 이루어진 힌트 집합의 예다.
7360 0 2
2507 0 1
9713 1 1
9678 2 2
위 힌트 집합이면 숫자를 충분히 알아낼 수 있고 답은 9876이다.
반대로 다음 힌트 집합은 숫자를 알아내기에 충분하지 않다.
7360 0 2
9713 1 1
9678 2 2
다음 힌트 집합과 모순되지 않는 숫자는 없다.
9678 2 2
1234 2 2
마지막 두 힌트 집합의 답은 NO다.
여러분은 주어진 힌트 집합으로 내가 생각한 숫자를 알아내는 프로그램을 작성해야 한다.
입력
입력은 다음과 같이 여러 힌트 집합으로 이루어진다. 각 힌트 집합은 내가 생각한 숫자 하나에 대응한다.
< HINT-SET1 >
< HINT-SET2 >
. . .
< HINT-SETi >
. . .
< HINT-SETn >
<HINT-SETi>는 다음 형식의 헤더 한 줄로 시작한다 (L과 H는 공백 한 칸으로 구분한다).
L H
이어서 다음 형식의 힌트 H줄이 나온다 (1 <= j <= H).
TRY1 HIT1 BLOW1
TRY2 HIT2 BLOW2
. . .
TRYj HITj BLOWj
. . .
TRYH HITH BLOWH
L은 내가 생각한 숫자의 자릿수이고, TRYj, HITj, BLOWj는 TRYj와 내가 생각한 숫자 사이의 hit과 blow 값이다. (각 값은 공백 한 칸으로 구분한다.)
입력의 끝은 L = 0, H = 0인 헤더 줄로 나타낸다.
출력
각 힌트 집합마다 답을 한 줄에 하나씩 출력한다. 주어진 힌트 집합으로 숫자를 알아낼 수 있으면 그 숫자를 출력한다. 숫자를 알아낼 수 없으면 NO를 출력한다.