Lv3 프로그래머스(Programmers)[Python][파이썬] 자물쇠와 열쇠

"""
출처:프로그래머스
https://school.programmers.co.kr/learn/courses/30/lessons/60059
"""

# 포인트 사고: 자물쇠의 위치를 바꿈과 동시에 열쇠를 이동시키는 아이디어!

# 풀이 과정
board = []
import copy

def open_(key, distance, lock):
check = [[0] * distance for _ in range(distance)]

for x in range(1, distance - len(key)):
for y in range(1, distance - len(key)):

for i in range(len(key)):
for j in range(len(key)):
check[i + x][j + y] = key[i][j]

for i in range(len(key), len(key) + len(lock)):
for j in range(len(key), len(key) + len(lock)):
if check[i][j] + board[i][j] != 1:
break
else:
continue

break

else:
return True

check = [[0] * distance for _ in range(distance)]

return False


def rotation(key, r):
count = 0
change = [[0] * len(key) for _ in range(len(key))]

for i in range(len(key)):
for j in range(len(key)):
change[j][len(key) - i - 1] = key[i][j]
return change


def solution(key, lock):
global board
distance = len(key) * 2 + len(lock)

board = [[0] * (len(key) * 2 + len(lock)) for _ in range(len(key) * 2 + len(lock))]
lock_count = 0

for i in range(len(lock)):
for j in range(len(lock)):
board[len(key) + i][len(key) + j] = lock[i][j]
if lock[i][j] == 0:
lock_count += 1

key_count = 0

for i in range(len(key)):
for j in range(len(key)):
if key[i][j] == 1:
key_count += 1

# for i in range(4):
# key = rotation(key, i + 1)
# print(key)

if lock_count > key_count:
return False

open_door = open_(key, distance, lock)

if open_door == True:
return True

# 90,180,270
for i in range(4):
key = rotation(key, i + 1)
open_door = open_(key, distance, lock)

if open_door == True:
return True

return False