key와 lock이 주어질 때, key를 상하좌우, 회전하여 lock의 홈에 끼워넣을 수 있는지를 반환한다.
💻Solution
def right_rotate_90_degree(key):
new_key = []
for i in zip(*key):
new_key.append(list(reversed(i)))
return new_key
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)
# 자물쇠 확장하기
new_lock = [[0 for _ in range(n*3)] for _ in range(n*3)]
for i in range(n):
for j in range(n):
new_lock[i+n][j+n] = lock[i][j]
# 열쇠 확인하기
for _ in range(4):
key = right_rotate_90_degree(key)
for x in range(n*2):
for y in range(n*2):
for i in range(m):
for j in range(m):
new_lock[x+i][y+j] += key[i][j]
if check(new_lock) == True:
return True
for i in range(m):
for j in range(m):
new_lock[x+i][y+j] -= key[i][j]
return False
🗝️keypoint
주어진 list 시계방향으로 90도 회전하는 방법은, zip과 reversed를 활용하여 구현할 수 있다.
list 복제는 deepcopy를 활용할 수 있지만, slicing에 비해 속도가 현저히 떨어진다.