[ํ๋ก๊ทธ๋๋จธ์ค / Pythonํ์ด์ฌ] ์๋ฌผ์ ์ ์ด์
๋ฌธ์ ๋งํฌ: https://programmers.co.kr/learn/courses/30/lessons/60059
๋ฌธ์ ์ค๋ช
๊ณ ๊ณ ํ์์ธ "ํ๋ธ"๋ ๊ณ ๋ ์ ์ ์ง์์ ๋ณด๋ฌผ๊ณผ ์ ์ ์ด ๊ฐ๋ํ ๊ฒ์ผ๋ก ์ถ์ ๋๋ ๋น๋ฐ์ ๋ฌธ์ ๋ฐ๊ฒฌํ์์ต๋๋ค. ๊ทธ๋ฐ๋ฐ ๋ฌธ์ ์ด๋ ค๊ณ ์ดํด๋ณด๋ ํน์ดํ ํํ์ ์๋ฌผ์ ๋ก ์ ๊ฒจ ์์๊ณ ๋ฌธ ์์๋ ํน์ดํ ํํ์ ์ด์ ์ ํจ๊ป ์๋ฌผ์ ๋ฅผ ํธ๋ ๋ฐฉ๋ฒ์ ๋ํด ๋ค์๊ณผ ๊ฐ์ด ์ค๋ช ํด ์ฃผ๋ ์ข ์ด๊ฐ ๋ฐ๊ฒฌ๋์์ต๋๋ค.
์ ๊ฒจ์๋ ์๋ฌผ์ ๋ ๊ฒฉ์ ํ ์นธ์ ํฌ๊ธฐ๊ฐ 1 x 1์ธ N x N ํฌ๊ธฐ์ ์ ์ฌ๊ฐ ๊ฒฉ์ ํํ์ด๊ณ ํน์ดํ ๋ชจ์์ ์ด์ ๋ M x M ํฌ๊ธฐ์ธ ์ ์ฌ๊ฐ ๊ฒฉ์ ํํ๋ก ๋์ด ์์ต๋๋ค.
์๋ฌผ์ ์๋ ํ์ด ํ์ฌ ์๊ณ ์ด์ ๋ํ ํ๊ณผ ๋๊ธฐ ๋ถ๋ถ์ด ์์ต๋๋ค. ์ด์ ๋ ํ์ ๊ณผ ์ด๋์ด ๊ฐ๋ฅํ๋ฉฐ ์ด์ ์ ๋๊ธฐ ๋ถ๋ถ์ ์๋ฌผ์ ์ ํ ๋ถ๋ถ์ ๋ฑ ๋ง๊ฒ ์ฑ์ฐ๋ฉด ์๋ฌผ์ ๊ฐ ์ด๋ฆฌ๊ฒ ๋๋ ๊ตฌ์กฐ์ ๋๋ค. ์๋ฌผ์ ์์ญ์ ๋ฒ์ด๋ ๋ถ๋ถ์ ์๋ ์ด์ ์ ํ๊ณผ ๋๊ธฐ๋ ์๋ฌผ์ ๋ฅผ ์ฌ๋ ๋ฐ ์ํฅ์ ์ฃผ์ง ์์ง๋ง, ์๋ฌผ์ ์์ญ ๋ด์์๋ ์ด์ ์ ๋๊ธฐ ๋ถ๋ถ๊ณผ ์๋ฌผ์ ์ ํ ๋ถ๋ถ์ด ์ ํํ ์ผ์นํด์ผ ํ๋ฉฐ ์ด์ ์ ๋๊ธฐ์ ์๋ฌผ์ ์ ๋๊ธฐ๊ฐ ๋ง๋์๋ ์๋ฉ๋๋ค. ๋ํ ์๋ฌผ์ ์ ๋ชจ๋ ํ์ ์ฑ์ ๋น์ด์๋ ๊ณณ์ด ์์ด์ผ ์๋ฌผ์ ๋ฅผ ์ด ์ ์์ต๋๋ค.
์ด์ ๋ฅผ ๋ํ๋ด๋ 2์ฐจ์ ๋ฐฐ์ด key์ ์๋ฌผ์ ๋ฅผ ๋ํ๋ด๋ 2์ฐจ์ ๋ฐฐ์ด lock์ด ๋งค๊ฐ๋ณ์๋ก ์ฃผ์ด์ง ๋, ์ด์ ๋ก ์๋ฌผ์ ๋ฅผ ์ด ์ ์์ผ๋ฉด true๋ฅผ, ์ด ์ ์์ผ๋ฉด false๋ฅผ return ํ๋๋ก solution ํจ์๋ฅผ ์์ฑํด์ฃผ์ธ์.
์ ํ์ฌํญ
- key๋ M x M(3 ≤ M ≤ 20, M์ ์์ฐ์)ํฌ๊ธฐ 2์ฐจ์ ๋ฐฐ์ด์ ๋๋ค.
- lock์ N x N(3 ≤ N ≤ 20, N์ ์์ฐ์)ํฌ๊ธฐ 2์ฐจ์ ๋ฐฐ์ด์ ๋๋ค.
- M์ ํญ์ N ์ดํ์ ๋๋ค.
- key์ lock์ ์์๋ 0 ๋๋ 1๋ก ์ด๋ฃจ์ด์ ธ ์์ต๋๋ค.
- 0์ ํ ๋ถ๋ถ, 1์ ๋๊ธฐ ๋ถ๋ถ์ ๋ํ๋ ๋๋ค.
์ ์ถ๋ ฅ ์
key | lock | result |
[[0, 0, 0], [1, 0, 0], [0, 1, 1]] | [[1, 1, 1], [1, 1, 0], [1, 0, 1]] | true |
๋ฌธ์ ํ์ด
๋ฌธ์ ์์ ์๊ตฌํ๋ ๋ฐ๋ฅผ ์ ํํ๊ฒ ๊ตฌํํ๋ฉด ๋๋ ๋ฌธ์ ์๋ค. key์ lock์ ์ต๋ ํฌ๊ธฐ๊ฐ 20์ด๋ฏ๋ก ๊ฐ ์์๋ฅผ ๋ชจ๋ ํ์ํ๋ค ํด๋ 20 x 20 = 400๋ฒ์ด๋ค. ๋ฐ๋ผ์ ์์ ํ์์ผ๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค.
์ฒ์์ ์ด์ ๋ฅผ (0, 0)๋ถํฐ (N, N)๊น์ง๋ง ์ด๋์ํค๋ฉด ๋๋ค๊ณ ์๋ชป ์๊ฐํด์ ๊ผฌ์์๋ค. ์ด์ ์ ๋ง์ง๋ง ๋ถ๋ถ (M, M)์ผ๋ก ์๋ฌผ์ ์ ์์ ๋ถ๋ถ (0, 0)์ ์ฌ๋ ๊ฒฝ์ฐ๊น์ง ์๊ฐ์ ๋ชปํ๋ ๊ฒ์ด๋ค. ์คํํ~~
์ด๋ฅผ ํธํ๊ฒ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์๋ฌผ์ ๋ฅผ ์๋ ํฌ๊ธฐ์ 3๋ฐฐ๋ฅผ ํ๊ณ ์๋ณธ์ ๊ฐ์ด๋ฐ์ ๋์๋ค. ์๋ฅผ ๋ค์ด ์๋์ lock ๋ค์๊ณผ ๊ฐ์ 3 x 3 ๋ฐฐ์ด์ด๋ผ๊ณ ํ๋ฉด
์๋์ ๊ฐ์ด 9 x 9 ๋ฐฐ์ด๋ก ๋ฐ๊ฟ ์ ์๋ค.
์๋ฌผ์ ๋ฅผ ์ฌ๋ ์กฐ๊ฑด์ ๋ค์๊ณผ ๊ฐ๋ค.
- lock์ด 0์ด๋ฉด key๊ฐ 1์ด์ด์ผ ํ๋ค.
- lock์ด 1์ด๋ฉด key๊ฐ 0์ด์ด์ผ ํ๋ค.
๋ฐ๋ผ์ lock๊ณผ key๋ฅผ ๋ํ์ ๋ lock์ ๋ชจ๋ ์์๊ฐ 1์ด๋ฉด ์๋ฌผ์ ๋ฅผ ์ด ์ ์๋ค. ๋ฐ๋ผ์ ์กฐ๊ฑด์ ๋ง๊ฒ key๋ฅผ ์ด๋ ๋ฐ ํ์ ํด๊ฐ๋ฉฐ ์๋ฌผ์ ๋ฅผ ์ด ์ ์๋์ง ํ์ํ๋ฉด ๋๋ค.
์์ ํ์์ ์ ๊ตฌํํ๋ค๊ณ ์๊ฐํ๋๋ฐ ์๊พธ ํ ์คํธ ์ผ์ด์ค 4๊ฐ ์ ๋๋ฅผ ํ๋ ค์ ํค๋งธ๋ค. ์๊ณ ๋ณด๋ 2์ฐจ์ ๋ฆฌ์คํธ ํ์ ์ ๊ตฌํํ๋ ๋ถ๋ถ์์ result[n - r - 1][n - c - 1]์ result[n - c - 1][n - r - 1]๋ก ์๋ชป ์ฐ๋ ์ค์๊ฐ ์์๋ค.๐ญ ๊ตฌํ ๋ฌธ์ ๋ฅผ ํ ๋ ์ด๋ฐ ์ฌ์ํ ์ค์๋ฅผ ํ๋ ๊ฒฝ์ฐ๊ฐ ์ข ์ข ์์๋ค. ์์ผ๋ก ์ฝ๋ ์งค ๋ ๋ ๊ผผ๊ผผํ ์ดํด๋ณด๊ณ ์ค์๋ฅผ ์ค์ฌ์ผ๊ฒ ๋ค..!
์์ค์ฝ๋
# ์๋ฌผ์ ์ ์ด์
# NxN 2์ฐจ์ ๋ฆฌ์คํธ d๋ ํ์
# ํ์ ๊ฐ๋ d => 1: 90๋, 2: 180๋, 3: 270๋
def rotate(array, d):
n = len(array) # ๋ฐฐ์ด์ ๊ธธ์ด
result = [[0] * n for _ in range(n)]
if d % 4 == 1:
for r in range(n):
for c in range(n):
result[c][n - r - 1] = array[r][c]
elif d % 4 == 2:
for r in range(n):
for c in range(n):
result[n - r - 1][n - c - 1] = array[r][c]
elif d % 4 == 3:
for r in range(n):
for c in range(n):
result[n - c - 1][r] = array[r][c]
else:
for r in range(n):
for c in range(n):
result[r][c] = array[r][c]
return result
# ์๋ฌผ์ ์ค๊ฐ NxN ๋ถ๋ถ์ด ๋ชจ๋ 1์ธ์ง ํ์ธ
def check(new_lock):
n = len(new_lock) // 3
for i in range(n, n * 2):
for j in range(n, n * 2):
if new_lock[i][j] != 1:
return False
return True
def solution(key, lock):
m = len(key)
n = len(lock)
# ๊ธฐ์กด ์๋ฌผ์ ๋ณด๋ค 3๋ฐฐ ํฐ ์๋ฌผ์
new_lock = [[0] * (n * 3) for _ in range(n * 3)]
# ์๋ก์ด ์๋ฌผ์ ์ ์ค์ ๋ถ๋ถ์ ๊ธฐ์กด ์๋ฌผ์ ๋ฃ๊ธฐ
for i in range(n):
for j in range(n):
new_lock[n + i][n + j] = lock[i][j]
# ์ด์ ๋ฅผ (1, 1)๋ถํฐ (N*2, N*2)๊น์ง ์ด๋์ํค๋ฉฐ ํ์ธ
for i in range(1, n * 2):
for j in range(1, n * 2):
# ์ด์ ๋ฅผ 0, 90, 180, 270๋๋ก ํ์ ์ํค๋ฉฐ ํ์ธ
for d in range(4):
r_key = rotate(key, d) # key๋ฅผ d๋งํผ ํ์ ์ํจ ๋ฆฌ์คํธ
for x in range(m):
for y in range(m):
new_lock[i + x][j + y] += r_key[x][y]
if check(new_lock):
return True
for x in range(m):
for y in range(m):
new_lock[i + x][j + y] -= r_key[x][y]
return False