STUDY/Algorithm

[백준] 2239 스도쿠 python(pypy)

sinawi95 2022. 2. 16. 10:32
728x90

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

 

2239번: 스도쿠

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

www.acmicpc.net

전형적인 백트래킹 문제이다.

import sys; input = sys.stdin.readline

def is_correct(value, r, c):
    global sudoku, find_list
    # 1 check row
    for i in range(9):
        if value == sudoku[r][i]:
            return False
    # 2 check col
    for i in range(9):
        if value == sudoku[i][c]:
            return False
    # 3 check square
    for i in range(3):
        for j in range(3):
            rr = 3 * (r // 3) + i
            cc = 3 * (c // 3) + j
            if value == sudoku[rr][cc]:
                return False
    return True

def backtrack(ind):
    global sudoku, find_list, flag
    if flag:
        return
    if ind == len(find_list):
        for i in range(9):
            print(*sudoku[i], sep='')
        flag = True
        return

    r, c = find_list[ind][0], find_list[ind][1]

    for i in range(1, 10):
        if not is_correct(i, r, c):
            continue
        sudoku[r][c] = i
        backtrack(ind + 1)
        sudoku[r][c] = 0


def main():
    global sudoku, find_list, flag
    sudoku = []
    find_list = []
    for i in range(9):
        sudoku.append(list(map(int, input().rstrip())))
        for j in range(9):
            if not sudoku[i][j]:
                find_list.append((i, j))
    flag = False
    backtrack(0)



if __name__ == "__main__":
    main()

setrecursionlimit 이 메모리를 많이 차지하는지 몰라서 계속 메모리 초과가 떴다.

그리고 확인하는 부분이 계속 들어가다보니 속도가 빠른 pypy에서만 가능한듯 싶다.

'STUDY > Algorithm' 카테고리의 다른 글

[백준] 9019 DSLR C++  (0) 2022.02.18
[백준] 1717 집합의 표현 python  (0) 2022.02.17
[백준] 11779 최소비용 구하기 2 python  (0) 2022.02.15
[백준] 6087 레이저 통신 python  (0) 2022.02.14
[백준] 10282 해킹 python  (0) 2022.02.14