IT recording...

[BOJ] 2580 스도쿠 - python 본문

Algorithm

[BOJ] 2580 스도쿠 - python

I-one 2021. 12. 2. 21:06

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

 

2580번: 스도쿠

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

www.acmicpc.net

풀이

  1. 빈칸을 채워야 하는 것이므로 빈 칸의 좌표를 가지고 있는 list를 만든다.
  2. 해당 빈 칸들을 돌며 가능한 후보들을 찾는다.
  3. 해당 빈 칸에 가능한 후보를 sdoku맵에 업데이트한 후 그 다음 빈 칸을 검사하러 간다.
  4. 만약 가능한 후보가 없다면 해당 route는 자동으로 종료된다.
  5. sdoku판을 다시 원상복구 시킨 후 다음 candidate를 검사한다.
  6. 마지막 zero까지 다 채워넣는 것이 성공한다면 스도쿠를 완성한 것이다.
import sys
def input():
    return sys.stdin.readline().rstrip()

sdoku = [list(map(int,input().split(" "))) for _ in range(9)]
zeros = [(i,j) for i in range(9) for j in range(9) if sdoku[i][j] == 0] #빈칸만 뽑아내기

def get_candidate(a,b):
    cand = set()
    # 가로,세로 검사
    for num in range(9):
        cand.add(sdoku[a][num]) # 가로 검사
        cand.add(sdoku[num][b]) # 세로 검사
    # block 검사
    for r in range((a // 3) * 3,(a // 3) * 3 + 3):
        for c in range((b // 3) * 3, (b // 3) * 3 + 3):
            cand.add(sdoku[r][c])
    candidate = list({1, 2, 3, 4, 5, 6, 7, 8, 9} - cand)
    return candidate

#바뀌는 것 zero, sdoku(변경, 원상복구해가며)
def dfs(zero_index):
    #종료조건
    if zero_index == len(zeros): #zero 마지막까지 완료했으면
        [print(*row) for row in sdoku] #한 줄 단위로 프린트
        sys.exit()

    #가지치기
    a,b = zeros[zero_index]
    candidate = get_candidate(a,b) #candidate가 없다면 자동으로 해당 route는 종료된다. 
    for c in candidate:
        sdoku[a][b] = c #스도쿠 판 바꿔서 전달
        dfs(zero_index+1)
        sdoku[a][b] = 0 #원상복구

dfs(0) #zero 0부터 다 돌면서 확인

얻어가는 것

  • 좌표 뽑아내기
#빈칸만 뽑아내기
zeros = [(i,j) for i in range(9) for j in range(9) if sdoku[i][j] == 0] 
  • 사칙연산
/ : 나누기(소숫점까지)
// : 몫
% : 나머지
  • 리스트에 존재하는 수를 한 줄로 프린트하기
list = [1,2,3,4,5,6]
print(***list**)
>> 1 2 3 4 5 6

#한 줄 단위로 여러 줄 프린트
[print(*row) for row in sdoku] 

느낀점

"211110"

소요 시간 : 3h

  • 오랜만에 dfs를 접해서 너무 어려웠다
  • 코테 오늘부터 다시 시작,,, 빠팅빠샤,,,

'Algorithm' 카테고리의 다른 글

[BOJ] 1339 단어 수학 - python  (0) 2021.12.02
[BOJ] 11659 구간 합 구하기 4 - python  (0) 2021.12.02
[BOJ] 1759 암호 만들기 - python  (0) 2021.12.02
[BOJ] 1920 수 찾기 - python  (0) 2021.12.02
[BOJ] 1039 교환 - python  (0) 2021.12.02
Comments