문제
프로그래머스 자물쇠와 열쇠
풀이
def rotate(key):
copy = [[0] * len(key) for _ in range(len(key))]
for i in range(len(key)):
for j in range(len(key)):
copy[j][len(key)-i-1] = key[i][j]
return copy
def unlock_check(board,lock,lock_margin):
for i in range(len(lock)):
for j in range(len(lock)):
if board[lock_margin + i][lock_margin + j] != 1:
return False
return True
def solution(key, lock):
lock_margin = len(key) - 1
max_length = 58 # 최대치 20 20 20, 거기에 겹쳐있어야하는 부분 최소 한곳은 존재 : -1 두번
for i in range(lock_margin + len(lock)):
for j in range(lock_margin + len(lock)):
# 회전 4번
for _ in range(4):
board = [[0] * max_length for _ in range(max_length)]
# lock 배치
for l in range(len(lock)):
for k in range(len(lock)):
board[lock_margin + l][lock_margin + k] = lock[l][k]
# key 배치
for kl in range(len(key)):
for kj in range(len(key)):
board[i + kl][j + kj] += key[kl][kj]
# unlock 확인
if unlock_check(board,lock,lock_margin):
return True
key = rotate(key)
return False
요약
- 제한사항의 최대치에 맞춘 최대치의 도화지를 미리 설정해놓고 시작한다.
- 자물쇠와 열쇠는 최소 한군데는 겹치게끔 한 후에 90도씩 4번을 돌며 돌기가 겹치는 부분 없이 완벽히 들어맞을때까지 모든 경우에 대해 for문을 돈다.
- 자물쇠와 열쇠는 최소 한군데는 겹쳐야 검사의 의미가 있으므로 (키의 길이-1) + (자물쇠의 길이)를 기준으로 for문을 도며 4번의 회전에 대해 for문을 돈다.
- 후에는 자물쇠의 위치를 먼저 배치하고 이 후에 열쇠의 위치를 배정하며 열쇠가 자물쇠에 들어맞는지를 확인하며 맞지 않을시 rotate, 맞다면 거기서 바로 True를 return한다.
- 모든 경우에 대해 탐색을 진행했는데도 True로 return되지 않았다면 자물쇠와 열쇠가 맞지 않는 것이므로 False를 return한다.