๐Ÿค– ์•Œ๊ณ ๋ฆฌ์ฆ˜

[baekjoon] 2580 ์Šค๋„์ฟ  (python)

be__simon 2021. 7. 26. 19:10

๋ฌธ์ œ


9 x 9 2์ฐจ์› ๋ฐฐ์—ด์ด ์ฃผ์–ด์ง€๋ฉด ์Šค๋„์ฟ  ๊ทœ์น™์— ์˜๊ฑฐํ•ด์„œ ๋นˆ์นธ์— ์ˆซ์ž๋ฅผ ์ฑ„์šฐ๋ฉด ๋œ๋‹ค.



์ ‘๊ทผ๋ฒ•


๊ฐ€๋กœ, ์„ธ๋กœ, 9์นธ ๊ตฌ์—ญ์— ๊ฐ™์€ ์ˆซ์ž๊ฐ€ ์—†๋Š”์ง€ ํŒ๋‹จํ•˜๊ณ , ๋„ฃ์„ ์ˆ˜ ์žˆ๋Š” ์ˆซ์ž๋ฅผ ๋„ฃ๊ณ  ๋‹ค์Œ ๋นˆ์นธ์œผ๋กœ ๋„˜์–ด๊ฐ„๋‹ค.
๋‹ค์Œ ๋นˆ์นธ์—์„œ ๋ถˆ๊ฐ€๋Šฅํ•˜๋ฉด ์›๋ž˜ ๋นˆ์นธ์œผ๋กœ ๋„˜์–ด์™€์„œ ๋‹ค๋ฅธ ์ˆซ์ž๋ฅผ ๋„ฃ์–ด๋ณธ๋‹ค (๋ฐฑํŠธ๋ž˜ํ‚น)


pypy๋กœ ํ•˜๋ฉด ํ†ต๊ณผํ•˜๋Š”๋ฐ python3๋กœ ์ œ์ถœํ•˜๋ฉด ๊ณ„์† ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋‚œ๋‹ค.
์ฒ˜์Œ์—” ๋นˆ์นธ๋“ค์„ deque๋กœ ๊ด€๋ฆฌํ•ด์„œ ๊ทธ๋ƒฅ ๋ฐฐ์—ด๋กœ ๋ณ€๊ฒฝํ•ด๋ณด๊ณ ,
1~9 ์ˆซ์ž๋ฅผ ๋„ฃ์„ ๋•Œ๋งˆ๋‹ค ์ค‘๋ณต์ฒดํฌ ํ•ด์ฃผ๋˜ ๋กœ์ง์„ ๋”ฐ๋กœ ๋นผ์„œ, ๊ฐ€๋Šฅํ•œ ์ˆซ์ž๋“ค๋งŒ ๊ฐ€์ง€๊ณ  ํŠธ๋ž˜ํ‚น์„ ํ•ด๋ด๋„ ์‹œ๊ฐ„์ดˆ๊ณผ๋‹ค.
๋‚˜๋จธ์ง€๋Š” ํ•„์š”ํ•œ ๋กœ์ง ๊ฐ™์€๋ฐ.. cpp๋กœ ํ•˜๋ฉด ๋˜๋ ค๋‚˜
์‹œ๊ฐ„์ดˆ๊ณผ๋ฅผ ์žก๋Š” ๊ฒƒ ๋ณด๋‹ค ๋‹ค๋ฅธ ๊ณต๋ถ€๋ฅผ ํ•˜๋Š”๊ฒŒ ์ƒ์‚ฐ์ ์ผ ๊ฒƒ ๊ฐ™์•„ ์ผ๋‹จ์€ ๋„˜์–ด๊ฐ„๋‹ค.



Code


# input
board = [list(map(int, input().split())) for _ in range(9)]

blank = [(i, j) for i in range(9) for j in range(9) if board[i][j] == 0]

def check_blank(idx):
    if idx == len(blank):
        # print
        for i in range(9):
            print(' '.join(map(str,board[i])))
        exit()

    i, j = blank[idx]

    pi = (i // 3) * 3
    pj = (j // 3) * 3
    num_list = []
    for num in range(1, 10):
        pos = True
        for k in range(9): # ๊ฐ€๋กœ, ์„ธ๋กœ, ์ •์‚ฌ๊ฐํ˜• ๊ตฌ์—ญ์— ํ•˜๋‚˜๋ผ๋„ ์ค‘๋ณต๋˜๋ฉด ๋ถˆ๊ฐ€๋Šฅ
            if board[i][k] == num or board[k][j] == num or board[pi + k // 3][pj + k % 3] == num:
                pos = False
                break
        if pos:
            num_list.append(num)

    for num in num_list:
        board[i][j] = num
        check_blank(idx + 1)
        board[i][j] = 0


check_blank(0)

๊ฑด์ „ํ•œ ํ”ผ๋“œ๋ฐฑ์€ ์–ธ์ œ๋‚˜ ํ™˜์˜์ž…๋‹ˆ๋‹ค :D