ํŒŒ์ด์ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜

[์ด์ฝ”ํ…Œ Ch12-10] ์ž๋ฌผ์‡ ์™€ ์—ด์‡  (๊ตฌํ˜„)

์€์ง„ 2022. 3. 15. 19:50

๐Ÿ‘ฉ๐Ÿปโ€๐Ÿ’ป๋ฌธ์ œ์„ค๋ช…

[์ด์ฝ”ํ…Œ Ch12-10] ์ž๋ฌผ์‡ ์™€ ์—ด์‡  (๊ตฌํ˜„)
์ด์ฝ”ํ…Œ

โœ๏ธIdea Sketch

๋ฌธ์ œ ์š”์•ฝ

์ž๋ฌผ์‡ ์™€ ํšŒ์ „, ์ด๋™์ด ๊ฐ€๋Šฅํ•œ ์—ด์‡ ๊ฐ€ ์žˆ๋‹ค.
๋ชฉํ‘œ : ์ž๋ฌผ์‡ ์˜ ๋ชจ๋“  ์˜์—ญ์„ 1๋กœ ์ฑ„์šฐ๊ธฐ = ์ž๋ฌผ์‡ ์˜ ๋ชจ๋“  ํ™ˆ์„ ์ฑ„์šฐ๊ธฐ

์—ด์‡  ์›€์ง์ž„ ์ข…๋ฅ˜

  1. ํšŒ์ „ : ์‹œ๊ณ„๋ฐฉํ–ฅ 90๋„ (90๋„ ํ•จ์ˆ˜ ํ•˜๋‚˜ ๋งŒ์œผ๋กœ 180๋„, 270๋„ ๋™์ž‘ ๊ฐ€๋Šฅ)
  2. ์ด๋™ : ์ƒํ•˜์ขŒ์šฐ 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