파이톨치

[BOJ][Python][2580] 스도쿠 - 시간초과 본문

알고리즘

[BOJ][Python][2580] 스도쿠 - 시간초과

파이톨치 2021. 8. 4. 10:00
728x90

[문제 및 출처]

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

 

2580번: 스도쿠

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

www.acmicpc.net

[어떻게 풀까?]

흠...일단 아직 백트래킹을 어떻게 쓰는지 감이 잘 안 잡혀서 아무 생각 없이 구현이라도 해봐자는 마음으로 코드를 작성해 보았다. 정말 비효율적인 코드라고 나도 생각한다. 그렇기에 시간초과가 걸리고 말았고 이에 대해 다시 공부해야겠다는 생각을 가지게 되었다.

[CODE]

COLUM, ROW = 9, 9
board = [[0 for i in range(COLUM)] for j in range(ROW)] 
for i in range(COLUM):
        board[i] = list(map(int, input().split()))

#더하면 45    

def 가로체크(): #성공!
    for i in range(COLUM):
        temp, cnt = 0, 0
        index = 0 
        for j in range(ROW):
            if board[i][j] == 0:
                cnt += 1
                index = j
            temp += board[i][j]

        ok = 45 - temp
        if cnt == 1 and 1<= ok <= 9:
            board[i][index] = ok
    
def 세로체크(): #성공!
    for j in range(ROW):
        temp, cnt, index = 0, 0, 0
        for i in range(COLUM):
            if board[i][j] == 0:
                cnt += 1
                index = i
            temp += board[i][j]
        
        ok = 45 - temp
        if cnt == 1 and 1 <= ok <= 9:
            board[index][j] = ok

def 사각형체크(): #성공!
    for I in range(3):
        for J in range(3):
            temp, cnt, index_x, index_y = 0, 0, 0, 0
            for i in range(I*3, I*3+3):
                for  j in range(J*3, J*3+3):
                    if board[i][j] == 0:
                        cnt += 1
                        index_x, index_y = j, i
                    temp += board[i][j]
            ok = 45 - temp
            if cnt == 1 and 1<= ok <=9:
                board[index_y][index_x] = ok


def one_set():
    cnt = 1
    while cnt != 0:
        cnt = 0
        for i in range(COLUM):
            if 0 in board[i]:
                cnt += 1
                가로체크()
                세로체크()
                사각형체크()
    
one_set()

for line in board:
    for num in line:
        print(num, end= " ")
    print()

 

728x90

'알고리즘' 카테고리의 다른 글

[BOJ][Python] 2156-포도주 시식  (0) 2021.08.08
[BOJ][Python] 2579번-계단 오르기  (0) 2021.08.07
[BOJ][Pyhon][9184] 신나는 함수 실행  (0) 2021.08.02
[BOJ][Python][9663] N-Queen  (0) 2021.08.01
[BOJ][Python][15651] N과 M(4)  (0) 2021.07.31