π©π»βπ»λ¬Έμ μ€λͺ
[μ΄μ½ν
Ch12-10] μλ¬Όμ μ μ΄μ (ꡬν)
βοΈIdea Sketch
λ¬Έμ μμ½
μλ¬Όμ μ νμ , μ΄λμ΄ κ°λ₯ν μ΄μ κ° μλ€.
λͺ©ν : μλ¬Όμ μ λͺ¨λ μμμ 1λ‘ μ±μ°κΈ° = μλ¬Όμ μ λͺ¨λ νμ μ±μ°κΈ°
μ΄μ μμ§μ μ’ λ₯
- νμ : μκ³λ°©ν₯ 90λ (90λ ν¨μ νλ λ§μΌλ‘ 180λ, 270λ λμ κ°λ₯)
- μ΄λ : μνμ’μ° 1μΉΈ
μ€μ μμ΄λμ΄ : μλ¬Όμ λ°°μ΄ νμ₯
μκ°λ³΅μ‘λ
O(n^4), O(n^2 * m^2)
μλ¬Όμ μ μ΄μ μ μ΅λ ν¬κΈ°λ 20 * 20μΌλ‘, μκ° μ΄κ³Όλ₯Ό μμνλ μ°μ°νμ 1μ΅κ³Όλ κ±°λ¦¬κ° λ©λ€. λ°λΌμ λΈλ£¨νΈν¬μ€ μκ³ λ¦¬μ¦(μμ νμ)μ μλν΄λ΄μ§ νλ€.
μ΄ λ¬Έμ λ μλ¬Όμ λ°°μ΄μ 3n * 3nμΌλ‘ νμ₯ν ν, κ°λ₯ν λͺ¨λ μμμ λν΄ μ΄μ m * m μ λμ‘°ν΄λ΄μΌ νλ€. λ°λΌμ μλ¬Όμ λ₯Ό νμν¨κ³Ό λμμ μ΄μ λ₯Ό νμνλ―λ‘ O(n^2 * m^2) μ΄λ€. μΌλ°μ μΌλ‘ νννλ©΄ O(n^4) μΌλ‘, μ€μ λ‘ μ¬μ€ forλ¬Έμ μ¬μ©νλ€.
μκ³ λ¦¬μ¦ : ꡬν, λΈλ£¨νΈν¬μ€ (μμ νμ)
λ¬Έμ μ΄ν΄λ μ½μ§λ§ μλ¬Όμ λ°°μ΄ νμ₯μ΄λΌλ μμ΄λμ΄λ₯Ό λ μ¬λ¦¬μ§ λͺ»ν΄ νλμ½λ©λ§ νλ€κ° κ³ μκ³ μν λ¬Έμ μ΄λ€. μ΄μ μ νμ , μλ¬Όμ μ μ΄μ λ₯Ό λΌμ λ£μ ν λΉΌκΈ° μ²λΌ λ¨μν΄ λ³΄μ΄λ λμλ μκ°λ³΄λ€ ꡬννκΈ° μ΄λ €μ λ€.
βοΈλ΄ μμ€μ½λ
- create_graph() : μλ¬Όμ λ°°μ΄μ 3n * 3nμΌλ‘ νμ₯μν€λ ν¨μλ€. 3n * 3n λ°°μ΄μ μμ±ν ν, κ°μ΄λ°μ μλ¬Όμ λ₯Ό λ°°μΉνλ€.
- rotate() : μ΄μ λ₯Ό μκ³λ°©ν₯μΌλ‘ 90λ νμ μν¨λ€.
- unlock() : κ°μ΄λ°μ μμΉν μλ¬Όμ μ λͺ¨λ valueκ° 1μΈμ§ νμΈνλ€.
- solution() : λ©μΈ ν¨μλ€. μ¬μ€ forλ¬ΈμΌλ‘ μλ¬Όμ λ°°μ΄ graphλ₯Ό νμν¨κ³Ό λμμ μ΄μ λ₯Ό λΌμ λ£μ - unlockμΈμ§ νμΈ - μ΄μ λ₯Ό λΉΌλ μΌλ ¨μ κΈ°λ₯μ λμνλ€.
def create_graph(n, lock):
graph = [[0] * (n*3) for _ in range(n * 3)]
for i in range(n):
for j in range(n):
graph[i + n][j + n] = lock[i][j]
return graph
def unlock(n, graph):
for i in range(n, n * 2):
for j in range(n, n * 2):
if graph[i][j] != 1:
return False
return True
def rotate(m, key):
nkey = [[0] * m for _ in range(m)]
for i in range(m):
for j in range(m):
nkey[j][-i + m - 1] = key[i][j]
return nkey
def solution(key, lock):
n, m = len(lock), len(key)
graph = create_graph(n, lock)
for _ in range(4): # 90, 180, 270, 360
key = rotate(m, key)
for x in range(n * 2):
for y in range(n * 2):
for i in range(m):
for j in range(m):
graph[x + i][y + j] += key[i][j]
if unlock(n, graph):
return True
for i in range(m):
for j in range(m):
graph[x + i][y + j] -= key[i][j]
return False