๐ ๋ฌธ์ ์ค๋ช
์ค๋์ฟ ๋ 18์ธ๊ธฐ ์ค์์ค ์ํ์๊ฐ ๋ง๋ '๋ผํด ์ฌ๊ฐํ'์ด๋ ํผ์ฆ์์ ์ ๋ํ ๊ฒ์ผ๋ก ํ์ฌ ๋ง์ ์ธ๊ธฐ๋ฅผ ๋๋ฆฌ๊ณ ์๋ค. ์ด ๊ฒ์์ ์๋ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ๊ฐ๋ก, ์ธ๋ก ๊ฐ๊ฐ 9๊ฐ์ฉ ์ด 81๊ฐ์ ์์ ์นธ์ผ๋ก ์ด๋ฃจ์ด์ง ์ ์ฌ๊ฐํ ํ ์์์ ์ด๋ค์ง๋๋ฐ, ๊ฒ์ ์์ ์ ์ผ๋ถ ์นธ์๋ 1๋ถํฐ 9๊น์ง์ ์ซ์ ์ค ํ๋๊ฐ ์ฐ์ฌ ์๋ค.
๋๋จธ์ง ๋น ์นธ์ ์ฑ์ฐ๋ ๋ฐฉ์์ ๋ค์๊ณผ ๊ฐ๋ค.
- ๊ฐ๊ฐ์ ๊ฐ๋ก์ค๊ณผ ์ธ๋ก์ค์๋ 1๋ถํฐ 9๊น์ง์ ์ซ์๊ฐ ํ ๋ฒ์ฉ๋ง ๋ํ๋์ผ ํ๋ค.
- ๊ตต์ ์ ์ผ๋ก ๊ตฌ๋ถ๋์ด ์๋ 3x3 ์ ์ฌ๊ฐํ ์์๋ 1๋ถํฐ 9๊น์ง์ ์ซ์๊ฐ ํ ๋ฒ์ฉ๋ง ๋ํ๋์ผ ํ๋ค.
์์ ์์ ๊ฒฝ์ฐ, ์ฒซ์งธ ์ค์๋ 1์ ์ ์ธํ ๋๋จธ์ง 2๋ถํฐ 9๊น์ง์ ์ซ์๋ค์ด ์ด๋ฏธ ๋ํ๋ ์์ผ๋ฏ๋ก ์ฒซ์งธ ์ค ๋น์นธ์๋ 1์ด ๋ค์ด๊ฐ์ผ ํ๋ค.
๋ํ ์์ชฝ ๊ฐ์ด๋ฐ ์์นํ 3x3 ์ ์ฌ๊ฐํ์ ๊ฒฝ์ฐ์๋ 3์ ์ ์ธํ ๋๋จธ์ง ์ซ์๋ค์ด ์ด๋ฏธ ์ฐ์ฌ์์ผ๋ฏ๋ก ๊ฐ์ด๋ฐ ๋น ์นธ์๋ 3์ด ๋ค์ด๊ฐ์ผ ํ๋ค.
์ด์ ๊ฐ์ด ๋น ์นธ์ ์ฐจ๋ก๋ก ์ฑ์ ๊ฐ๋ฉด ๋ค์๊ณผ ๊ฐ์ ์ต์ข ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์๋ค.
๊ฒ์ ์์ ์ ์ค๋์ฟ ํ์ ์ฐ์ฌ ์๋ ์ซ์๋ค์ ์ ๋ณด๊ฐ ์ฃผ์ด์ง ๋ ๋ชจ๋ ๋น ์นธ์ด ์ฑ์์ง ์ต์ข ๋ชจ์ต์ ์ถ๋ ฅํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ํ ์ค์ ๊ฑธ์ณ ํ ์ค์ 9๊ฐ์ฉ ๊ฒ์ ์์ ์ ์ค๋์ฟ ํ ๊ฐ ์ค์ ์ฐ์ฌ ์๋ ์ซ์๊ฐ ํ ์นธ์ฉ ๋์์ ์ฐจ๋ก๋ก ์ฃผ์ด์ง๋ค. ์ค๋์ฟ ํ์ ๋น ์นธ์ ๊ฒฝ์ฐ์๋ 0์ด ์ฃผ์ด์ง๋ค. ์ค๋์ฟ ํ์ ๊ท์น๋๋ก ์ฑ์ธ ์ ์๋ ๊ฒฝ์ฐ์ ์ ๋ ฅ์ ์ฃผ์ด์ง์ง ์๋๋ค.
์ถ๋ ฅ
๋ชจ๋ ๋น ์นธ์ด ์ฑ์์ง ์ค๋์ฟ ํ์ ์ต์ข ๋ชจ์ต์ ์ํ ์ค์ ๊ฑธ์ณ ํ ์ค์ 9๊ฐ์ฉ ํ ์นธ์ฉ ๋์์ ์ถ๋ ฅํ๋ค.
์ค๋์ฟ ํ์ ์ฑ์ฐ๋ ๋ฐฉ๋ฒ์ด ์ฌ๋ฟ์ธ ๊ฒฝ์ฐ๋ ๊ทธ ์ค ํ๋๋ง์ ์ถ๋ ฅํ๋ค.
์ ํ
baekjoon์ ๋ฐฑํธ๋ํน ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ํ ์ ์๋ ์ ๋ ฅ๋ง ์ฃผ์ด์ง๋ค. ๋ค์์ ๊ทธ ์๊ณ ๋ฆฌ์ฆ์ ์ํ ์๊ฐ์ด๋ค.
- C++14: 80ms
- Java: 292ms
- PyPy3: 1172ms
๐ก ๋ฌธ์ ํ์ด
๋ฐฑํธ๋ํน์ ์ด์ฉํ์ฌ ์ค๋์ฟ ๋ฅผ ์์ฑ์ํค๋ ๋ฌธ์ ๋ค.
์ขํ๋ก 9x9 ๋ฐฐ์ด์ ํ์ํ๋ฉฐ ์ซ์๊ฐ ์ ํด์ง์ง ์์(0) ์นธ์ ๋ค์ด๊ฐ ์ ์๋ ๊ฐ๋ฅํ ์ซ์๋ค์ ์ฐพ๋๋ค.
๊ฐ๋ฅํ ์ซ์๋ค์ ํด๋น ์นธ์ ํ, ์ด, ์ ์ฌ๊ฐํ(3x3)์ ์์นํ ์ซ์๋ค ์ค ๊ณตํต์ผ๋ก ๋ํ๋์ง ์์ ๊ฐ์ด๋ค.
set() ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ด์ฉํ์ฌ ํ, ์ด, ์ ์ฌ๊ฐํ(3x3)์ ์์นํ ์ซ์๋ค์ ๋ชจ๋ ๋ด์ ํ all(1~9๊น์ง ๋ด์ set)๊ณผ์ ์ฐจ์งํฉ์ ์ด์ฉํ์ฌ ๋ค์ด๊ฐ ์ ์๋ ํ๋ณด๋ฅผ ๊ตฌํ์๋ค.
์ดํ ๋ฐ๋ณต๋ฌธ ๋ฐ ๋ฐฑํธ๋ํน์ผ๋ก ํ๋ณด๋ค์ ํ๋์ฉ ๋ฃ์ด๊ฐ๋ฉฐ, ์ค๋์ฟ ์์ฑ์ด ๊ฐ๋ฅํ์ง ํ์ํ๋ฉด ๋๋ค.
๊ฐ๋ฅํ ์ค๋์ฟ ๋ ๋ค์์ผ ์ ์์ง๋ง ๊ทธ์ค ํ๋๋ง ์ถ๋ ฅํ๋ฉด ๋๋ฏ๋ก solve ํจ์์ ์ข ๋ฃ์์ ์ด ๋๋ฉด exit()๋ฅผ ์ด์ฉํ์ฌ ๋ ์ด์ ํ์ํ์ง ์๊ณ ์ข ๋ฃํ์๋ค.
์ฝ๋๋ ๋ค์๊ณผ ๊ฐ๋ค.
def check(r, c):
global matrix, cols
exist = set()
for num in matrix[r]: # ์ด ํ์
if num: exist.add(num)
for idx in range(9): # ํ ํ์
if matrix[idx][c]: exist.add(matrix[idx][c])
sr, sc = r//3*3, c//3*3
for i in range(sr, sr+3): # 3x3 ํ์
for j in range(sc, sc+3):
if matrix[i][j]: exist.add(matrix[i][j])
return list(all - exist) # ๊ฐ๋ฅํ ํ๋ณด ์ซ์๋ค์ return
def res():
for row in matrix:
print(' '.join(map(str, row)))
def solve(r, c):
if c == 9: r += 1; c = 0 # ํ ํ์ ํ์์ ๋ง์น๋ฉด ๋ค์ ํ ์ฒซ ๋ฒ์งธ ์นธ์ผ๋ก ์ด๋ํ๋ค.
if r > 8 or c > 8: # 9x9 ์ค๋์ฟ ํ์ ์ข
๋ฃ
res() # ์ค๋์ฟ ์ถ๋ ฅ
exit() # ํ์ ์ข
๋ฃ
if not matrix[r][c]: # ์ซ์๊ฐ ์ ํด์ง์ง ์์ ์นธ
candidates = check(r, c)
for num in candidates:
matrix[r][c] = num
solve(r, c+1)
matrix[r][c] = 0
else:
solve(r, c+1)
matrix = [list(map(int, input().split())) for _ in range(9)]
all = set(i for i in range(1, 10))
solve(0, 0)
Python3๋ก ์ ์ถํ์ ๋๋ '์๊ฐ์ด๊ณผ'๊ฐ ๋ฐ์ํ๋ ๋ฌธ์ ์๋ค.
๋ฌธ์ ์์๋ '์ ํ'์ Pypy3์ ์ํ ์๊ฐ์ ์ ์ด๋จ๋๋ฐ Python3๋ก ๊ณ์ ์๋ํ๋ฉด์ ๋ ์๊ฐ์ ๋ญ๋นํ๋ค... ๐
'Algorithm > BaekJoon' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Algorithm] BaekJoon : 1647. ๋์ ๋ถํ ๊ณํ by Python (0) | 2021.02.19 |
---|---|
[Algorithm] BaekJoon : 2470. ๋ ์ฉ์ก by Python (0) | 2021.02.18 |
[Algorithm] BaekJoon : 20055. ์ปจ๋ฒ ์ด์ด ๋ฒจํธ ์์ ๋ก๋ด by Python (0) | 2021.02.14 |
[Algorithm] BaekJoon : 17837. ์๋ก์ด ๊ฒ์ 2 by Python (0) | 2021.02.14 |
[Algorithm] BaekJoon : 17142. ์ฐ๊ตฌ์ 3 by Python (0) | 2021.02.09 |
๋๊ธ