๐ฉ๐ปโ๐ป๋ฌธ์ ์ค๋ช
[์ด์ฝํ
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