[백준 2580] 스도쿠

Junyoung Park·2022년 7월 7일
0

코딩테스트

목록 보기
497/631
post-thumbnail

1. 문제 설명

스도쿠

2. 문제 분석

백트래킹 문제. 백트래킹 자체보다 유효 숫자를 판별하는 로직에서 시간 초과가 계속 났기 때문에 집합으로 바꿔주고, 중복 숫자를 해결했다.

3. 나의 풀이

import sys

nodes = [list(map(int, sys.stdin.readline().rstrip().split())) for _ in range(9)]
zeros = [(i, j) for i in range(9) for j in range(9) if nodes[i][j] == 0]

zero_cnt = len(zeros)

def number_check(row, col):
    numbers = set()

    for i in range(9):
        numbers.add(nodes[i][col])
        numbers.add(nodes[row][i])

    box_row, box_col = row // 3, col // 3

    for i in range(box_row * 3, box_row * 3 + 3):
        for j in range(box_col * 3, box_col * 3 + 3):
            numbers.add(nodes[i][j])

    numbers = set(range(1, 10)).difference(numbers)
    numbers = list(numbers)
    numbers.sort()

    return numbers

def DFS(cnt):

    if cnt == zero_cnt:
        for row in nodes:
            print(*row)
        exit(0)

    row, col = zeros[cnt]
    numbers = number_check(row, col)
    for num in numbers:
        nodes[row][col] = num
        DFS(cnt + 1)
        nodes[row][col] = 0

DFS(0)
profile
JUST DO IT

0개의 댓글