[문제 링크]
https://programmers.co.kr/learn/courses/30/lessons/60059
[입출력 예]
key |
lock |
result |
[[0, 0, 0], [1, 0, 0], [0, 1, 1]] |
[[1, 1, 1], [1, 1, 0], [1, 0, 1]] |
true |
[소스코드]
def rotate(lock):
rotated = [[ 0 for _ in range(len(lock))] for _ in range(len(lock))]
for r in range(len(lock)):
for c in range(len(lock)):
rotated[len(lock)-1-c][r]=lock[r][c]
return rotated
def check(lock_length,key_length,lock,key,delta_x,delta_y):
for lock_x_idx , _ in enumerate(range(lock_length)):
for lock_y_idx , _ in enumerate(range(lock_length)):
key_x_idx = lock_x_idx -(delta_x)
key_y_idx = lock_y_idx - (delta_y)
if not (0<=key_x_idx<key_length and 0<=key_y_idx<key_length):
# 5. key에서 인덱스가 벗어날 경우 lock 값만 가지고 판단
if (lock[lock_x_idx][lock_y_idx]==0): return False
# 6. 덧셈이 아니라 비트연산 XOR로 처리해주어야 한다.
elif lock[lock_x_idx][lock_y_idx] ^ key[key_x_idx][key_y_idx]!=1:
return False
return True
def solution(key, lock):
answer = False
lock_length = len(lock)
key_length = len(key)
#1. lock의 좌표를 고정시키고 key만 움직이기
# lock의 왼쪽 상단 좌표를 0,0으로 고정.
# key의 왼쪽 상단 좌표의 범위는 -(key_length-1) ~ lock_length-1
#2. 순회는 lock 기준으로 한다.
#key가 -2,-2만큼 움직인 상태면 lock(0,0)과 key(-(-2),-(-2))의 값을 더해야 한다.
#key의 범위에서 벗어나는 값을 요구하면 continue
#3 세로축이 x축, 가로축이 y축, 음의 방향으로 증가
#4. 한 위치에서 4방향으로 회전해서 맞는 경우 있나 보고 위치 바꾸기
#반시계 회전은 f(x,y)->f(y,n-x)
for delta_x in range(-(key_length-1),lock_length):
for delta_y in range(-(key_length-1),lock_length):
for _ in range(4):
if check(lock_length,key_length,lock,key,delta_x,delta_y):
return True
lock=rotate(lock)
return False