///
Search

자물쇠와 열쇠

from typing import List def attach(x, y, M, key, board): # 현재 보드판 위치 기준으로 키를 위치시킨다 for i in range(M): for j in range(M): board[x + i][y + j] += key[i][j] def detach(x, y, M, key, board): # 위치 시킨 키를 다시 제거한다 for i in range(M): for j in range(M): board[x + i][y + j] -= key[i][j] def rotate_keys(key: List, M): ret = [[0] * M for _ in range(M)] # 4번 for r in range(M): for c in range(M): ret[c][M - 1 - r] = key[r][c] # ret = key[:] # ret = list(zip(*ret[::-1])) return ret def check_fit(board, M, N): # lock 위치에 하나라도 비어 있다면 그것은 안 맞는 것 for i in range(N): for j in range(N): if board[M + i][M + j] != 1: return False return True def solution(key, lock): M, N = len(key), len(lock) board = [[0] * (M * 2 + N) for _ in range(M * 2 + N)] # print(board) for i in range(N): for j in range(N): # key 기준으로 i, j을 배치 (가운데 배치) board[M + i][M + j] = lock[i][j] # print(board) rotated_key = key # 모든 방향 (4번 루프) for _ in range(4): rotated_key = rotate_keys(rotated_key, M) # 겹치기 위해서는 1부터 시작해야한다 for x in range(1, M + N): for y in range(1, M + N): attach(x, y, M, rotated_key, board) if (check_fit(board, M, N)): return True detach(x, y, M, rotated_key, board) return False if __name__ == '__main__': key = [[0, 0, 0], [1, 0, 0], [0, 1, 1]] # len = m lock = [[1, 1, 1], [1, 1, 0], [1, 0, 1]] # len = n boolean = solution(key, lock) print(boolean)
Python
복사
1.
M*2 + N 크기의 격자판을 만든다.
2.
자물쇠를 가운데 배치한다.
3.
키를 움직이며 격자판에 결합되는지 확인한다.
a.
90도 돌린키를 자물쇠의 모든 칸에 갖다대본다.
b.
180도 돌린키를 자물쇠의 모든 칸에 갖다대본다.
c.
270도 돌린키를 자물쇠의 모든 칸에 갖다대본다.
d.
360도 돌린키를 자물쇠의 모든 칸에 갖다대본다.
결합되는 경우 True 리턴한다.