목차

자물쇠와 열쇠

ps
링크programmers.co.kr/…
출처프로그래머스
문제 번호60059
문제명자물쇠와 열쇠
레벨Level 3
분류

브루트포스, 구현

시간복잡도O(n^2*m^2)
인풋사이즈n<=20, m<=20
사용한 언어Python
해결날짜2022/01/17

풀이

코드

"""Solution code for "Programmers 60059. 자물쇠와 열쇠".

- Problem link: https://programmers.co.kr/learn/courses/30/lessons/60059
- Solution link: http://www.teferi.net/ps/problems/programmers/60059
"""


def solution(key, lock):
    key_size, lock_size = len(key), len(lock)

    key_pos = set()
    for r, key_row in enumerate(key):
        key_pos.update((r, c) for c, val in enumerate(key_row) if val == 1)
    lock_pos = set()
    for r, lock_row in enumerate(lock):
        lock_pos.update((r, c) for c, val in enumerate(lock_row) if val == 0)

    for _ in range(4):
        key_pos = {(c, key_size - r) for r, c in key_pos}
        for dr in range(-key_size, lock_size):
            for dc in range(-key_size, lock_size):
                moved = {(r + dr, c + dc)
                         for r, c in key_pos
                         if 0 <= r + dr < lock_size and 0 <= c + dc < lock_size}
                if moved == lock_pos:
                    return True
    return False