백준(BOJ) 2239 스도쿠 파이썬(Python)

문제 링크

구현이 많이 복잡했던 문제.
머리를 꽤 오래 싸매고서야 겨우 풀 수 있었다.
기본 스도쿠 보드인 board 외에 열을 탐색하기 위에 전치한 보드인 board_trans와 3x3 위치를 탐색하기 위한 보드인 board_section을 만들었다.
또한 zeros0의 위치를 저장해 순서대로 탐색하도록 했다.
조건에 맞는 수를 걸러내고 각 보드의 숫자를 해당하는 숫자로 설정하고 다음 0으로 이동한다.
마지막 0까지 숫자를 채워넣으면 스도쿠 보드를 출력하고 sys.exit(0)로 탈출하는 식으로 작동한다.
그 과정에서 숫자를 잘못 넣은 경우 돌아가야 하는데, 이를 백트래킹으로 구현했다.

import sys
# 기본 스도쿠 보드
board = [list(map(int, input())) for _ in range(9)]

# 전치 스도쿠 보드
board_trans = [[board[j][i] for j in range(9)] for i in range(9)]

# 3x3 위치 보드
board_section = [[] for _ in range(9)]
zeros = []
for i in range(9):
    for j in range(9):
        board_section[i//3*3+j//3].append(board[i][j])
        if not board[i][j]:
            zeros.append((i, j))

def fill(i, j, n):
    for k in range(1, 10):
        # 각 보드 안에 이미 그 숫자가 있으면 continue
        if k in board[i] or k in board_trans[j] or k in board_section[i//3*3+j//3]:
            continue
        # 각 보드 안의 빈 칸을 해당 숫자로 갱신
        board[i][j] = board_trans[j][i] = board_section[i//3*3+j//3][(i-(i//3*3))*3+j-(j//3*3)] = k
        
        # 갱신 후 다음 칸으로 이동
        if n < len(zeros)-1:
            fill(*zeros[n+1], n+1)
        # 다음 칸이 없으면 출력하고 종료
        else:
            for line in board:
                print(*line, sep='')
            sys.exit(0)
    
    # 넣을 숫자가 없다면 다시 빈칸으로 만들고 돌아감(백트래킹)
    board[i][j] = board_trans[j][i] = board_section[i//3*3+j//3][(i-(i//3*3))*3+j-(j//3*3)] = 0

fill(*zeros[0], 0)

2024

맨 위로 이동 ↑

2023

세그먼트 트리

개요 선형적인 자료구조에서는 값에 접근하는 데에 \(O(1)\)이면 충분하지만, 대신 부분합을 구하는 데에는 \(O(N)\)이 필요하다. 그렇다면 이 자료구조를 이진 트리로 구성하면 어떨까? 값에 접근하는 데에 걸리는 시간이 \(O(\lg N)\)으로 늘어나지만 대신 부분합을 구하...

벨만-포드 알고리즘

개요 다익스트라 알고리즘과 함께 Single Sourse Shortest Path(SSSP) 문제를 푸는 알고리즘이다. 즉, 한 노드에서 다른 모든 노드로 가는 최단 경로를 구하는 알고리즘이다. 다익스트라 알고리즘보다 느리지만, 음수 가중치 간선이 있어도 작동하며, 음수 가중치 사...

다익스트라 알고리즘

개요 다익스트라 알고리즘은 Single Sourse Shortest Path(SSSP) 문제를 푸는 알고리즘 중 하나이다. 즉, 한 노드에서 다른 모든 노드로 가는 최단 경로를 구하는 알고리즘이다. 단, 다익스트라 알고리즘은 음수 가중치 엣지를 허용하지 않는다. 이 경우에는 벨만-...

맨 위로 이동 ↑