스도쿠 검증
이중 for문과 중 for문을 이용하여 스도쿠의 정답 여부를 판별하였다.
for i in range(9):
ch1=[0]*10
ch2=[0]*10
for j in range(9):
ch1[a[i][j]]=1
ch2[a[j][i]]=1
if sum(ch1)!=9 or sum(ch2)!=9:
return False
for i in range(3):
for j in range(3):
ch3=[0]*10
for k in range(3):
for s in range(3):
ch3[a[i*3+k][j*3+s]]=1
if sum(ch3)!=9:
return False
return True
스도쿠의 정답 여부를 판별하기 위해선 가로(행)과 세로(열) 그리고 3x3 내에서의 검증이 필요하다. 먼저 가로(행)과 세로(열)을 검증하기 위해 ch1, ch2 리스트를 만들었다.
ch1은 현재 행에서 등장한 숫자를 기록한 리스트이고
ch2은 현재 열에서 등장한 숫자를 기록한 리스트이다.
이중 for문을 돌면서 숫자 i가 등장했을 때 ch1[i] ch2[i]의 값을 1로 표시한다.
기존 값에 +1을 하는 게 아닌 1로 표시하기 때문에
만약 중복된 숫자가 등장해도 2가 되는 것이 아닌 1이 표시된다.
5 3 4 6 7 8 9 1 1
위 예시를 보면 1이 두 번 등장하고 2는 등장하지 않는다. 크기가 10인 check 리스트를 만들고 for문을 돌린 후 다시 check 리스트를 살펴보면
check[1]=1
check[2]=0
이라는 결과를 볼 수 있다. 따라서 sum(check) 값을 8이 될 것이다.
즉, sum(ch1) != 9 이면 스도쿠 규칙이 깨졌다고 말할 수 있다.
다음 3x3 블록을 검증하기 위해서 사중 fod문을 만들었다. 바깥 for문(i, j)은 9개의 3x3 블록을 검증하기 위해 사용되었다.
i=0 j=0 왼쪽 위 블록
i=0 j=1 가운데 위 블록
i=0 j=2 오른쪽 위 블록
i=1 j=0 왼쪽 중간 블록
i=1 j=1 가운데 중간 블록
i=1 j=2 오른쪽 중간 블록
i=2 j=0 왼쪽 아래 블록
i=2 j=1 가운데 아래 블록
i=2 j=2 오른쪽 아래 블록
안쪽 for문(k, s)는 현재 블록 내에서 세로, 가로 방향으로 이동하기 위해 사용되었다.
즉 (i, j)가 특정 블록을 가리킬 때 (k, s)는 그 블록 내부의 각 칸을 순회한다.
이제 각 블록을 순회하면서 sum() 함수로 합계가 9인지 확인하면 스도쿠 규칙이 잘 지켜졌는지 확인할 수 있다.