[PS] 자물쇠와 열쇠 (프로그래머스)
[코테]프로그래머스 - 자물쇠와 열쇠
프로그래머스 Lv.3 - 자물쇠와 열쇠
( 2020 KAKAO BLIND RECRUITMENT )
https://programmers.co.kr/learn/courses/30/lessons/60059
import copy
def solution(key, lock):
answer = False
m = len(key)
n = len(lock)
map_ = fill_by_zero(lock, m-1, m-1 , 2*(m-1))
solution_lock = [[1 for __ in range(n)] for _ in range(n)]
# 회전 메서드
def rotate(arr):
return list(zip(*arr[::-1]))
def is_correct(lock_):
column_lock = lock_[m-1:-m+1]
col_row_lock = [z[m-1:-m+1] for z in column_lock]
if col_row_lock == solution_lock:
return True
return False
# key가 map_위에서 움직일 수 있는 시작점에 대한 반복 (i,j)
for _ in range(4):
key = rotate(key)
for i in range(m+n-1):
for j in range(m+n-1):
copy_map = copy.deepcopy(map_)
# (i,j) 에서 부터 key를 map_에 더하기
for y in range(m):
for x in range(m):
copy_map[i+y][j+x] += key[y][x]
# 가운데 lock 부분 1로 체워졌는지 체크
if is_correct(copy_map):
return True
return answer
# 0으로 남는 영역 채우기 (size만큼 늘려야함)
def fill_by_zero(arr, y, x, size):
length = len(arr)
zero_row_array = [[0 for _ in range(length + size)]]
for i in range(length):
# 왼쪽에 붙여야 하는 길이 : x
# 오른쪽에 붙여야 하는 길이 : size-x
arr[i] = [0 for _ in range(x)] + arr[i] + [0 for _ in range(size-x)]
# 위에 붙여야 하는 길이 : y
for i in range(y):
arr = zero_row_array + arr
# 아래에 붙여야 하는 길이 : size-y
for i in range(size-y):
arr += zero_row_array
return arr