[코테]프로그래머스 - 자물쇠와 열쇠

프로그래머스 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