<๋ฌธ์ ๋งํฌ>
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)
'โญ Problem_Solving > ๋ฐฑ์ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค] 2072 ์ค๋ชฉ (Python/ํ์ด์ฌ) (1) | 2022.12.28 |
---|---|
[๋ฐฑ์ค] 5635 ์์ผ (Python/ํ์ด์ฌ) (2) | 2022.12.18 |
[๋ฐฑ์ค] 11559 Puyo Puyo (Python/ํ์ด์ฌ) (0) | 2022.11.10 |
[๋ฐฑ์ค] 1253 ์ข๋ค (Python/ํ์ด์ฌ) (1) | 2022.11.08 |
[๋ฐฑ์ค] 1368 ๋ฌผ๋๊ธฐ (Python/ํ์ด์ฌ) (0) | 2022.10.16 |
๋๊ธ