[Programmers] 자물쇠와 열쇠
Updated:
자물쇠와 열쇠
자물쇠와 열쇠 를 클릭하면 바로 이동한다.
키를 90도로 네 번 회전 시켜 모든 경우를 확인하면 된다.
키를 90도로 회전을 했는데 일일이 키와 자물쇠를 대보는 과정이 막막했다.
처음엔 키를 잘라서 계속 확장해나가며 비교해 봐야 하는가 했는데 아니었다.
애초에 자물쇠 배열을 세 배 정도 확장하고 자물쇠를 가운데 넣어주면 키를 넣기 쉬워진다.
키를 처음부터 한 칸씩 옮겨가며 계속 열리는지 여부를 확인하면 된다.
역시 구현 문제를 풀 때마다 느끼지만 배열 인덱스를 가지고 푸는 문제는.. 정말.. 정말.. 어렵고 머리아프다..
def is_unlock(lock_map, lock_len):
for i in range(lock_len):
for j in range(lock_len):
if lock_map[i + lock_len][j + lock_len] == 0 or lock_map[i + lock_len][j + lock_len] == 2:
return False
return True
def push_key(start, lock_map, key):
for i in range(len(key)):
for j in range(len(key)):
lock_map[start[0] + i][start[1] + j] += key[i][j]
return
def pop_key(start, lock_map, key):
for i in range(len(key)):
for j in range(len(key)):
lock_map[start[0] + i][start[1] + j] -= key[i][j]
return
def solution(key, lock):
lock_len = len(lock)
lock_map = [[0 for _ in range(lock_len * 3)] for _ in range(lock_len * 3)]
# 자물쇠 확장
for i in range(lock_len):
for j in range(lock_len):
lock_map[i + lock_len][j + lock_len] = lock[i][j]
for _ in range(4):
# 90도 시계방향 회전
for idx, spin in enumerate(zip(*key)):
key[idx] = list(reversed(spin))
for i in range(len(lock_map) - lock_len + 1):
for j in range(len(lock_map) - lock_len + 1):
push_key([i, j], lock_map, key)
if is_unlock(lock_map, lock_len):
return True
pop_key([i, j], lock_map, key)
return False
Leave a comment