호프 2021. 7. 25. 23:17

 

import sys
input = sys.stdin.readline
arr = []

for _ in range(9):
    arr.append(list(map(int, input().rstrip())))

row = [[0]*10 for _ in range(10)]
col = [[0]*10 for _ in range(10)]
box = [[0]*10 for _ in range(10)]

for i in range(9):
    for j in range(9):
        n = arr[i][j]
        row[i][n] = 1
        col[j][n] = 1
        box[i//3+j//3*3][n] = 1

def solve(cnt):
    if (cnt==81):
        for i in range(9):
            for j in range(9):
                print(arr[i][j], end='')
            print()
        exit(0)
    
    y = cnt//9
    x = cnt%9
    
    if (arr[y][x]==0):
        for n in range(1, 10):
            if (row[y][n]==0 and col[x][n]==0 and box[y//3+x//3*3][n]==0):
                row[y][n]=1
                col[x][n]=1
                box[y//3+x//3*3][n]=1
                arr[y][x] = n
                solve(cnt+1)
                row[y][n]=0
                col[x][n]=0
                box[y//3+x//3*3][n]=0
                arr[y][x] = 0
                
    else:
        solve(cnt+1)
    
solve(0)

https://www.acmicpc.net/problem/2239

 

2239번: 스도쿠

스도쿠는 매우 간단한 숫자 퍼즐이다. 9×9 크기의 보드가 있을 때, 각 행과 각 열, 그리고 9개의 3×3 크기의 보드에 1부터 9까지의 숫자가 중복 없이 나타나도록 보드를 채우면 된다. 예를 들어 다

www.acmicpc.net

지금 예상치 못한.. 요상한 에러가 계속 나서 머리에 열이 오를대로 오른 상태이다..

col = [[0]*10]*10 이렇게 배열을 선언했더니 하나의 원소를 바꿨을 때 그게 모든 열에 적용이 되었다. 

row = [[0]*10 for _ in range(10)] 이 방식으로 선언하면 괜찮은데... 앞으로 저 방식으로는 절대 사용하면 안되겠다. 정말 이거때매 머리를 몇 번을 쥐어뜯었는지 모르겠다.

 

2580번 스도쿠 문제와 완전히 같은 문제이다. 그런데 중간에 이상한 실수를 너무 많이 했다. 위에서 말했던 것도 이미 이문제를 풀 때 한 번 겪었던 실수인데 또 반복했고, = 을 == 으로 쓴 걸 못보고 또 머리를 쥐어뜯었다. 이렇게 멍청할 수가...