새로운 블로그로 이전 작업을 진행하고 있어 포스트가 새로 작성되고 있지 않습니다.

빠른 시일 내에 새로운 블로그로 인사드리겠습니다.

새로운 블로그 : https://unho.vercel.app/

본문 바로가기
알고리즘 문제풀이/Python

[백준] 2580 스도쿠

by 언호 2022. 6. 20.

📖 문제


🧑🏻‍💻 풀이 과정

1) 문제 접근 및 이해

빈칸에 입력이 가능한 숫자들을 채워가며 스도쿠의 조건을 만족시켜야 했습니다.

빈칸으로 주어진 좌표들을 모두 리스트로 정리하였고, 좌표들을 반복하며 해당 좌표에 입력 가능한 숫자들을 모두 구한 후 숫자들을 넣어보며 탐색하였습니다.

2) 알고리즘

  • DFS
  • 재귀

3) 풀이 코드

사용 언어 - Python

import sys
sys.stdin = open('input.txt')

def get_can_num(y, x):                              # 행, 열, 사각형을 확인해서 들어갈 수 있는 번호 구하기
    can_num = {1, 2, 3, 4, 5, 6, 7, 8, 9}.difference(sudoku[y])     # 현재 행에서 들어갈 수 있는 번호

    for j in range(9):                              # 현재 열에서 들어갈 수 있는 번호
        if sudoku[j][x] in can_num:
            can_num.remove(sudoku[j][x])

    r = y//3 * 3
    c = x//3 * 3
    for i in range(r, r+3):                         # 현재 사각형에서 들어갈 수 있는 번호
        for j in range(c, c+3):
            if sudoku[i][j] in can_num:
                can_num.remove(sudoku[i][j])
    
    return can_num

def solution(n):
    if n == N:                      # 모든 번호를 찾았다면
        for i in range(9):          # 출력
            print(*sudoku[i])
        sys.exit(0)                 # 정답 한번 찾았으면 다음 탐색하지 않고 프로그램 종료

    y, x = coor[n]                  # 빈칸의 좌표
    for num in get_can_num(y, x):   # 해당 좌표에서 들어갈 수 있는 숫자들 넣어보기
        sudoku[y][x] = num          # 숫자 입력
        solution(n+1)               # 다음 좌표 탐색
        sudoku[y][x] = 0            # 불가능한 경우, 다시 빈칸


sudoku = [list(map(int, sys.stdin.readline().split())) for _ in range(9)]   # 주어진 입력
coor = []                                                                   # 빈칸인 좌표들

for i in range(9):
    for j in range(9):
        if not sudoku[i][j]:        # 빈칸 좌표
            coor.append((i, j))

N = len(coor)                       # 빈칸의 개수
solution(0)                         # 탐색

🔗 문제 링크

- https://www.acmicpc.net/problem/2580

 

2580번: 스도쿠

스도쿠는 18세기 스위스 수학자가 만든 '라틴 사각형'이랑 퍼즐에서 유래한 것으로 현재 많은 인기를 누리고 있다. 이 게임은 아래 그림과 같이 가로, 세로 각각 9개씩 총 81개의 작은 칸으로 이루

www.acmicpc.net

 

 

※ 오류 및 오타, 다른 의견이 있는 경우 댓글을 남겨주시면 감사하겠습니다

'알고리즘 문제풀이 > Python' 카테고리의 다른 글

[백준] 10986 나머지 합  (0) 2022.06.22
[백준] 3584 가장 가까운 공통 조상  (0) 2022.06.21
[백준] 1937 욕심쟁이 판다  (0) 2022.06.17
[백준] 2668 숫자고르기  (0) 2022.06.16
[백준] 2251 물통  (0) 2022.06.15

댓글