-
[Backtracking] BOJ 2580 μ€λμΏAlgorithms in Python/baekjoon 2021. 1. 19. 21:27
π λ°±μ€ 2580 μ€λμΏ
λ¬Έμ
μ€λμΏ λ 18μΈκΈ° μ€μμ€ μνμκ° λ§λ 'λΌν΄ μ¬κ°ν'μ΄λ νΌμ¦μμ μ λν κ²μΌλ‘ νμ¬ λ§μ μΈκΈ°λ₯Ό λλ¦¬κ³ μλ€. μ΄ κ²μμ μλ κ·Έλ¦Όκ³Ό κ°μ΄ κ°λ‘, μΈλ‘ κ°κ° 9κ°μ© μ΄ 81κ°μ μμ μΉΈμΌλ‘ μ΄λ£¨μ΄μ§ μ μ¬κ°ν ν μμμ μ΄λ€μ§λλ°, κ²μ μμ μ μΌλΆ μΉΈμλ 1λΆν° 9κΉμ§μ μ«μ μ€ νλκ° μ°μ¬ μλ€.
λλ¨Έμ§ λΉ μΉΈμ μ±μ°λ λ°©μμ λ€μκ³Ό κ°λ€.
- κ°κ°μ κ°λ‘μ€κ³Ό μΈλ‘μ€μλ 1λΆν° 9κΉμ§μ μ«μκ° ν λ²μ©λ§ λνλμΌ νλ€.
- κ΅΅μ μ μΌλ‘ ꡬλΆλμ΄ μλ 3x3 μ μ¬κ°ν μμλ 1λΆν° 9κΉμ§μ μ«μκ° ν λ²μ©λ§ λνλμΌ νλ€.
μμ μμ κ²½μ°, 첫째 μ€μλ 1μ μ μΈν λλ¨Έμ§ 2λΆν° 9κΉμ§μ μ«μλ€μ΄ μ΄λ―Έ λνλ μμΌλ―λ‘ μ²«μ§Έ μ€ λΉμΉΈμλ 1μ΄ λ€μ΄κ°μΌ νλ€.
λν μμͺ½ κ°μ΄λ° μμΉν 3x3 μ μ¬κ°νμ κ²½μ°μλ 3μ μ μΈν λλ¨Έμ§ μ«μλ€μ΄ μ΄λ―Έ μ°μ¬μμΌλ―λ‘ κ°μ΄λ° λΉ μΉΈμλ 3μ΄ λ€μ΄κ°μΌ νλ€.
μ΄μ κ°μ΄ λΉ μΉΈμ μ°¨λ‘λ‘ μ±μ κ°λ©΄ λ€μκ³Ό κ°μ μ΅μ’ κ²°κ³Όλ₯Ό μ»μ μ μλ€.
κ²μ μμ μ μ€λμΏ νμ μ°μ¬ μλ μ«μλ€μ μ λ³΄κ° μ£Όμ΄μ§ λ λͺ¨λ λΉ μΉΈμ΄ μ±μμ§ μ΅μ’ λͺ¨μ΅μ μΆλ ₯νλ νλ‘κ·Έλ¨μ μμ±νμμ€.
μ λ ₯
μν μ€μ κ±Έμ³ ν μ€μ 9κ°μ© κ²μ μμ μ μ€λμΏ ν κ° μ€μ μ°μ¬ μλ μ«μκ° ν μΉΈμ© λμμ μ°¨λ‘λ‘ μ£Όμ΄μ§λ€. μ€λμΏ νμ λΉ μΉΈμ κ²½μ°μλ 0μ΄ μ£Όμ΄μ§λ€. μ€λμΏ νμ κ·μΉλλ‘ μ±μΈ μ μλ κ²½μ°μ μ λ ₯μ μ£Όμ΄μ§μ§ μλλ€.
μΆλ ₯
λͺ¨λ λΉ μΉΈμ΄ μ±μμ§ μ€λμΏ νμ μ΅μ’ λͺ¨μ΅μ μν μ€μ κ±Έμ³ ν μ€μ 9κ°μ© ν μΉΈμ© λμμ μΆλ ₯νλ€.
μ€λμΏ νμ μ±μ°λ λ°©λ²μ΄ μ¬λΏμΈ κ²½μ°λ κ·Έ μ€ νλλ§μ μΆλ ₯νλ€.
β λ¬Έμ μ ν΅μ¬, νμ΄ κ³Όμ
• 0μ΄ μλ μ리μ μ μ ν μ«μλ₯Ό μ±μλ£μ΄μΌ νλ€.
=> 0μ΄ μλ μ’νλ₯Ό μ μ₯νλ 리μ€νΈλ₯Ό λ§λ€κ³ κ° μ’νλ [i, j]λ‘ μ μ₯νλ€.
• 0μ μμΉμμ νκ³Ό μ΄, κ΅΅μ μ μΌλ‘ ꡬλΆλμ΄ μλ 3x3 μ μ¬κ°ν μμ μ«μλ 1~9κΉμ§ νλ²λ§ μ°μ¬μΌ νλ€.
=> 0μ μμΉμμ ν, μ΄, μ μ¬κ°ν(3κ°μ§ 쑰건)μ μ‘΄μ¬νλ μ«μ 체ν¬κ° νμνλ€.
- 1~9 μ μ‘΄μ¬μ¬λΆλ₯Ό νλ¨νλ boolean check 리μ€νΈλ₯Ό λ§λ€κ³ Falseλ‘ μ΄κΈ°ν νλ€.
- 0μ μμΉμμ ν, μ΄, μ μ¬κ°ν νμ ν check[μ«μ] = Trueλ‘ λ°κΎΈμ΄μ€λ€.
- μ μ¬κ°νμ νμλ²μλ 0μ μ’νκ° x, yμΌλ x // 3 * 3, y // 3 * 3 λΆν° 3λ§νΌμ΄λ€.
• ν 0μ μμΉμμ μμ κ³Όμ μ ν΅ν΄ 곡ν΅μΌλ‘ μ°μ΄μ§ μμ μ«μλ₯Ό μ°Ύμλ€λ©΄ κ·Έ μ«μλ₯Ό λ£κ³ , λ€μ 0μ μμΉλ‘ λμ΄κ°μ 체ν¬λ₯Ό ν΄μΌνλ€.
=> 0μ μμΉμμ ν, μ΄, μ μ¬κ°ν νμ ν μ°μ΄μ§ μμ μ«μκ° μλ€λ©΄, forλ¬Έμ ν΅ν΄ μ°μ΄μ§ μμ μ«μλ₯Ό μ°¨λ‘λλ‘ μ€λμΏ μ λ£μ΄μ€λ€.
=> μ«μλ₯Ό 0μ μμΉμ λ£μ΄μ£Όκ³ , λ€μ 0μ indexλ‘ λμ΄κ°λ€.
=> λ€μ κ²½μ°μ μλ₯Ό μν΄ λ£μ μ«μλ₯Ό λ€μ 0μΌλ‘ λ°κΏμ€λ€.
• λ§μ½ 3κ°μ§ 쑰건μ λ§μ‘±νλ, μ°μ΄μ§ μμ μ«μκ° μλ€λ©΄ κ·Έ κ²½μ°λ νλ¦° κ²μ΄λ€.
=> returnμ ν΅ν΄ λμκ°λ€.
• μ€λμΏ νμ κ·μΉλλ‘ μ±μΈ μ μλ κ²½μ°μ μ λ ₯μ μ£Όμ΄μ§μ§ μλλ€.
=> λ°λΌμ λΆκ°λ₯ν κ²½μ°λ κ³ λ €νμ§ μμλ λλ€.
• μ±μ°λ λ°©λ²μ΄ μ¬λΏμΈ κ²½μ°λ κ·Έ μ€ νλλ§μ μΆλ ₯νλ€.
=> νλμ κ²½μ°λ₯Ό μ°ΎμΌλ©΄ λ°λ‘ exit(0)μΌλ‘ μ’ λ£νλ€.
β μ 체 μ½λ
import sys input = sys.stdin.readline def go(idx): # 0μ μ’ν μΈλ±μ€κ° λ§μ§λ§ + 1 μ΄λΌλ©΄ λ€ μ±μ΄ κ²μ΄λ―λ‘ μΆλ ₯νλ€. if idx == len(zero): for i in range(9): for j in range(9): print(arr[i][j], end=' ') print() exit(0) return x, y = zero[idx][0], zero[idx][1] check = [False] * 10 for i in range(9): # ν μ΄μ μλ μ«μ μ²΄ν¬ check[arr[i][y]] = True for j in range(9): # ν νμ μλ μ«μ μ²΄ν¬ check[arr[x][j]] = True for i in range(x // 3 * 3, x // 3 * 3 + 3): # 3*3 μ μ¬κ°ν μμ μλ μ«μ μ²΄ν¬ for j in range(y // 3 * 3, y // 3 * 3 + 3): check[arr[i][j]] = True # 3κ°μ§ 쑰건μμ 곡ν΅μΌλ‘ μ°μ΄μ§ μμ μ«μκ° μμΌλ©΄ λ€μ 0μΌλ‘ flag = False for i in range(1, 10): if not check[i]: flag = True arr[x][y] = i go(idx + 1) arr[x][y] = 0 # μ°μ΄μ§ μμ μ«μκ° μμΌλ©΄ return if not flag: return arr = [[]] * 9 for i in range(9): arr[i] = list(map(int, input().split())) # 0μΈ μ’νλ₯Ό μ μ₯νλ 리μ€νΈ μ΄κΈ°ν zero = [] for i in range(9): for j in range(9): if arr[i][j] == 0: zero.append([i, j]) go(0)
'Algorithms in Python > baekjoon' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[DFS/BFS] BOJ 18405 κ²½μμ μ μΌ (0) 2021.02.01 [DFS/BFS] BOJ 16234 μΈκ΅¬ μ΄λ (0) 2021.02.01 [Binary Search] BOJ 2470 λ μ©μ‘ (0) 2021.01.27 [Binary Search] BOJ 2110 곡μ κΈ° μ€μΉ (0) 2021.01.24 [DP] μ°μνλ κ²μ μ νν μ μμ λ (BOJ 2579, 2156) (0) 2021.01.18