[BOJ] 2580. ์Šค๋„์ฟ  (๐Ÿฅ‡, ๋ฐฑํŠธ๋ž˜ํ‚น)

lemythe423ยท2023๋…„ 9์›” 19์ผ
0

BOJ ๋ฌธ์ œํ’€์ด

๋ชฉ๋ก ๋ณด๊ธฐ
55/133
post-thumbnail

๐Ÿ”—

ํ’€์ด

์Šค๋„์ฟ ์˜ ๊ทœ์น™์— ๋งž๊ฒŒ ๊ฐ ๋นˆ์นธ์— ์ˆซ์ž๊ฐ€ ๋“ค์–ด๊ฐ€๋Š”์ง€ ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ์ˆซ์ž ์กฐํ•ฉ์„ ๋‹ค ๋„ฃ์–ด๋ณธ๋‹ค. ๋„์ค‘์— ํ•˜๋‚˜๋ผ๋„ ๊ทœ์น™์— ๋งž์ง€ ์•Š๋Š”๋‹ค๋ฉด ๋ฐฑํŠธ๋ž˜ํ‚น์œผ๋กœ ๊ฐ€์ง€๋ฅผ ์ณ๋‚ธ๋‹ค.

๋นˆ์นธ์ด ์†ํ•˜๋Š” ํ–‰, ์—ด, 3x3์นธ์— ์—†๋Š” ์ˆซ์ž๋“ค์„ ๊ต์ง‘ํ•ฉ์„ ํ†ตํ•ด ๊ตฌํ–ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ํ•˜๋‚˜์”ฉ ๋„ฃ์–ด๋ณด๊ณ  ๋งŒ์•ฝ ๋ชจ๋“  ์นธ์„ ๋‹ค ์ฑ„์šธ ์ˆ˜ ์žˆ์—ˆ๋‹ค๋ฉด True๋ฅผ ๋ฐ˜ํ™˜ํ–ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ๋˜๋ฉด ์‹ค์ œ ๋ฐฐ์—ด์— ๊ทธ ๊ฐ’์ด ๊ฑฐ๊พธ๋กœ ์ฑ„์›Œ์ง€๋ฉด์„œ ๋ฐ˜ํ™˜๋œ๋‹ค.

์ตœ์ข…์ ์œผ๋กœ arr ๋ฐฐ์—ด์„ ์ถœ๋ ฅํ•˜๋ฉด ๋œ๋‹ค.

# pypy3 : 3480ms
# ์Šค๋„์ฟ 

def check_row(x):
    return {k for k in range(1, 10) if k not in arr[x]}

def check_col(y):
    return {k for k in range(1, 10) if k not in [arr[x][y] for x in range(9)]}

def check_rect(x, y):
    res = set(range(1, 10))
    for i in range(3*x, 3*x+3):
        for j in range(3*y, 3*y+3):
            res -= {arr[i][j]}
    return res

def find_blank(arr):
    blank = dict()
    for i in range(9):
        for j in range(9):
            if not arr[i][j]:
                blank[(i, j)] = rows[i]&cols[j]&rects[3*(i//3)+j//3]
    return blank

def check(x, y, k):
    return k in rows[x]&cols[y]&rects[3*(x//3)+y//3]
    
def dfs(i, keys, arr):
    if i == len(keys):
        return True
        
    x, y = keys[i]
    for k in blank[(x, y)]:
        if check(x, y, k):
            rows[x].remove(k)
            cols[y].remove(k)
            rects[3*(x//3)+y//3].remove(k)
            if dfs(i+1, keys, arr):
                arr[x][y] = k
                return True
            rows[x].add(k)
            cols[y].add(k)
            rects[3*(x//3)+y//3].add(k)
    return False

arr = [list(map(int, input().split())) for _ in range(9)]
rows = [check_row(i) for i in range(9)]
cols = [check_col(j) for j in range(9)]
rects = [check_rect(i, j) for i in range(3) for j in range(3)]
blank = find_blank(arr)
keys = list(blank.keys())

dfs(0, keys, arr)
for row in arr:
    print(*row)
profile
์•„๋ฌด๋ง์ด๋‚˜ํ•˜๊ธฐ

0๊ฐœ์˜ ๋Œ“๊ธ€