1 분 소요

문제 출처

풀이

def solution(board):
  def is_valid(num, row, col):
    # ❶ 현재 위치에 num이 들어갈 수 있는지 검사
    return not (in_row(num, row) or in_col(num, col) or in_box(num, row, col))

  def in_row(num, row):
    # ❷ 해당 행에 num이 있는지 확인
    return num in board[row]

  def in_col(num, col):
    # ❸ 해당 열에 num이 있는지 확인하는 함수
    return num in (board[i][col] for i in range(9))

  def in_box(num, row, col):
    # ❹ 현재 위치의 3x3 박스에 num이 있는지 확인
    box_row = (row // 3) * 3
    box_col = (col // 3) * 3
    for i in range(box_row, box_row + 3):
      for j in range(box_col, box_col + 3):
        if board[i][j] == num:
          return True
    return False

  def find_empty_position():
    # ❺ 스도쿠 보드에서 비어 있는 위치 반환
    for i in range(9):
      for j in range(9):
        if board[i][j] == 0:
          return i, j
    return None

  def find_solution():
    # ❻ 비어 있는 위치에 가능한 숫자를 넣어가며 스도쿠 해결
    empty_pos = find_empty_position()
    # ❼ 빈 칸이 없으면 스도쿠가 해결된 것으로 간주
    if not empty_pos:
      return True
    row, col = empty_pos
    for num in range(1, 10):
      if is_valid(num, row, col):
        board[row][col] = num
        if find_solution():  # ❽ 다음 빈 칸으로 재귀적으로 탐색
          return True
        board[row][col] = 0  # ❾ 가능한 숫자가 없으면 원래의 0으로 되돌림
    return False

  find_solution()
  return board

댓글남기기