티스토리 뷰
📌문제
https://school.programmers.co.kr/learn/courses/30/lessons/60059
📌풀이
열쇠를 적당히 회전하고 이동시켜 자물쇠의 홈에 맞게 끼워 넣는 것
자물쇠의 크기의 3배인 새로운 리스트를 만들어 중앙 부분으로 옮김
자물쇠 리스트의 값에 열쇠 리스트의 값을 더한 뒤에 더한 결과가 자물쇠 부분의 모든 값이 1인지 확인
📌코드
#2차원 리스트 90도 회전
def rotate_a_matrix_by_90_degree(a):
n=len(a) #행 길이
m=len(a[0]) #열 길이
result=[[0]*n for _ in range(m)] #결과 리스트
for i in range(n):
for j in range(m):
result[j][n-i-1]=a[i][j]
return result
#자물쇠에 해당하는 부분이 모두 1인지 확인
def check(new_lock):
lock_length=len(new_lock) //3
for i in range(lock_length, lock_length*2):
for j in range(lock_length, lock_length*2):
if new_lock[i][j]!=1:
return False
return True
def solution(key, lock):
n=len(lock)
m=len(key)
#자물쇠의 크기를 기존의 3배로 변환
new_lock=[[0]*(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]
#4가지 방향에 대해 확인
for rotation in range(4):
key=rotate_a_matrix_by_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
📌참고