๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
โญ Problem_Solving/๋ฐฑ์ค€

[๋ฐฑ์ค€] 2239 ์Šค๋„์ฟ  (Python/ํŒŒ์ด์ฌ)

by ํฌ์ŠคํŠธ์‰์ดํฌ 2022. 11. 10.

<๋ฌธ์ œ ๋งํฌ>

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

 

2239๋ฒˆ: ์Šค๋„์ฟ 

์Šค๋„์ฟ ๋Š” ๋งค์šฐ ๊ฐ„๋‹จํ•œ ์ˆซ์ž ํผ์ฆ์ด๋‹ค. 9×9 ํฌ๊ธฐ์˜ ๋ณด๋“œ๊ฐ€ ์žˆ์„ ๋•Œ, ๊ฐ ํ–‰๊ณผ ๊ฐ ์—ด, ๊ทธ๋ฆฌ๊ณ  9๊ฐœ์˜ 3×3 ํฌ๊ธฐ์˜ ๋ณด๋“œ์— 1๋ถ€ํ„ฐ 9๊นŒ์ง€์˜ ์ˆซ์ž๊ฐ€ ์ค‘๋ณต ์—†์ด ๋‚˜ํƒ€๋‚˜๋„๋ก ๋ณด๋“œ๋ฅผ ์ฑ„์šฐ๋ฉด ๋œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค

www.acmicpc.net

<ํ’€์ด ์ „๋žต>

1. ํ–‰ / ์—ด / ์‚ฌ๊ฐํ˜•์— ๋Œ€ํ•ด ๊ฒ€์ฆ์„ ํ•˜๋ฉด์„œ ๋ฐฑํŠธ๋ž˜ํ‚น์„ ํ•˜๋ฉด ๋œ๋‹ค.

2. ์‚ฌ๊ฐํ˜• ์˜์—ญ์— ๋Œ€ํ•œ ๊ฒ€์ฆ์„ ์–ด๋–ป๊ฒŒ ํ• ์ง€๊ฐ€ ์กฐ๊ธˆ ๊นŒ๋‹ค๋กœ์šด๋ฐ ์ž์„ธํ•œ ๊ฑด ์ฝ”๋“œ๋ฅผ ์ฐธ๊ณ ํ•ด๋ณด์ž

 

<์ •๋‹ต ์ฝ”๋“œ>

from collections import defaultdict
import sys, os, io, atexit

input = lambda: sys.stdin.readline().rstrip('\r\n')
stdout = io.BytesIO()
sys.stdout.write = lambda s: stdout.write(s.encode("ascii"))
atexit.register(lambda: os.write(1, stdout.getvalue()))

# 220921 2239 ์Šค๋„์ฟ 

# ์ •๋‹ต์ฝ”๋“œ

# board: ์Šค๋„์ฟ  ๋ฐฐ์—ด 
N = 9
board = [list(map(int, input())) for _ in range(N)]


# find_square: ์ž…๋ ฅ๋ฐ›์€ ์ขŒํ‘œ๊ฐ€ ์Šค๋„์ฟ ์—์„œ ๋ช‡๋ฒˆ์จฐ ์‚ฌ๊ฐํ˜•์— ์œ„์น˜ํ•ด์žˆ๋Š”์ง€ ๋ฐ˜ํ™˜ํ•ด์ฃผ๋Š” ํ•จ์ˆ˜ 
def find_square(r, c):
    return (r // 3) * 3+ (c // 3)


# get_idx: 0-80์‚ฌ์ด์˜ ์ˆซ์ž๋ฅผ 9x9 ๋ฐฐ์—ด์˜ ์ขŒํ‘œ๋กœ ๋ณ€ํ™˜ํ•ด์„œ ๋ฐ˜ํ™˜ํ•ด์ฃผ๋Š” ํ•จ์ˆ˜
def get_idx(num):
    r = num // 9
    c = num % 9
    return r, c


# ๋ฐฑํŠธ๋ž˜ํ‚น์œผ๋กœ ์Šค๋„์ฟ  ์ฑ„์›Œ๋‚˜๊ฐ€๋Š” ํ•จ์ˆ˜
def back_tracking(depth):

    # ๋งˆ์ง€๋ง‰์นธ๊นŒ์ง€ ์Šค๋„์ฟ ๋ฅผ ์ฑ„์› ์„ ๊ฒฝ์šฐ
    if depth == 81:
        # ์ •๋‹ต ์ถœ๋ ฅ ํ›„ ์ข…๋ฃŒ
        for i in board:
            print(''.join(map(str, i)))
        exit(0)

    # r, c ์Šค๋„์ฟ  ๋ฐฐ์—ด์˜ ์ขŒํ‘œ
    r, c = get_idx(depth)

    # ์ˆซ์ž๊ฐ€ ์ด๋ฏธ ์ฑ„์›Œ์ ธ ์žˆ์„ ๊ฒฝ์šฐ์—” ๋ฐ”๋กœ ๋‹ค์Œ ์ขŒํ‘œ๋กœ ๋„˜์–ด๊ฐ„๋‹ค.
    if board[r][c]:
        back_tracking(depth + 1)

    else:
        # 1-9 ์ˆซ์ž ์„ ํƒ
        for num in numbers:
            # ํ–‰, ์—ด, ์‚ฌ๊ฐํ˜•์— ๊ฒน์น˜๋Š” ์ˆซ์ž๊ฐ€ ์—†์„ ๊ฒฝ์šฐ
            if not visited_row[r][num] and not visited_col[c][num] and not visited_square[find_square(r, c)][num]:
                
                # ์Šค๋„์ฟ  ๋ฐฐ์—ด์„ ์ฑ„์›Œ์ค€๋‹ค.
                board[r][c] = num
                # ํ–‰, ์—ด, ์‚ฌ๊ฐํ˜• ๋ฐฉ๋ฌธ ํ‘œ์‹œ
                visited_row[r][num] = 1
                visited_col[c][num] = 1
                visited_square[find_square(r, c)][num] = 1

                # ๋‹ค์Œ ์ขŒํ‘œ ์žฌ๊ท€์ ์œผ๋กœ ํƒ์ƒ‰ 
                back_tracking(depth + 1)

                # ๋ฐฑํŠธ๋ž˜ํ‚น
                board[r][c] = 0
                visited_row[r][num] = 0
                visited_col[c][num] = 0
                visited_square[find_square(r, c)][num] = 0

        # ๋ฐ˜๋ณต๋ฌธ์„ ๋‹ค ๋Œ์•˜๋Š”๋ฐ ์กฐ๊ฑด์— ๋งž๋Š” ์ˆซ์ž๋ฅผ ๋„ฃ์„ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ ๋ฐ˜ํ™˜
        else:
            return


# numbers: ์Šค๋„์ฟ ์— ์ฑ„์›Œ ๋„ฃ์„ ์ˆซ์ž๋“ค
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9]
# ํ–‰, ์—ด, ์‚ฌ๊ฐํ˜•์— ๋Œ€ํ•œ ๋ฐฉ๋ฌธ์—ฌ๋ถ€ ํ‘œ์‹œ ๋ฐฐ์—ด
visited_row = [[0 for _ in range(10)] for _ in range(10)]
visited_col = [[0 for _ in range(10)] for _ in range(10)]
visited_square = [[0 for _ in range(10)] for _ in range(10)]

# ์ฃผ์–ด์ง„ ๋ฐฐ์—ด ๊ธฐ๋ฐ˜์œผ๋กœ visited ๋ฐฐ์—ด ์ฑ„์›Œ ๋„ฃ๊ธฐ
for r in range(9):
    for c in range(9):
        if board[r][c]:
            visited_row[r][board[r][c]] = 1
            visited_col[c][board[r][c]] = 1
            visited_square[find_square(r, c)][board[r][c]] = 1

# ์ฒซ๋ฒˆ์จฐ ์นธ๋ถ€ํ„ฐ ์Šค๋„์ฟ  ์ฑ„์›Œ๋‚˜๊ฐ€๊ธฐ
back_tracking(0)

๋Œ“๊ธ€