
https://programmers.co.kr/learn/courses/30/lessons/60059
# Try
def solution(key, lock):
answer = False
n = len(lock)
m = len(key)
lock_x3 = [[0] * 3 * n for _ in range(3 * n)]
for i in range(n):
for j in range(n):
lock_x3[n + i][n + j] = lock[i][j]
"""
for i in range(n):
print(lock[i])
for i in range(3 * n):
print(lock_x3[i])
"""
for rotate in range(4):
key = rotate_90(key, m)
for x in range(n * 2):
for y in range(n * 2):
for i in range(m):
for j in range(m):
lock_x3[x + i][y + j] += key[i][j]
if check(lock_x3) == True:
return True
else:
for i in range(m):
for j in range(m):
lock_x3[x + i][y + j] -= key[i][j]
return answer
def rotate_90(key, m):
new_key = [[0]*m for _ in range(m)]
for i in range(m):
for j in range(m):
new_key[i][j] = key[m-1-j][i]
"""
for i in range(m):
print(new_key[i])
"""
return new_key
def check(lock_x3):
n = len(lock_x3) // 3
for i in range(n, n * 2):
for j in range(n, n * 2):
if lock_x3[i][j] != 1:
return False
return True
key = [[0, 0, 0], [1, 0, 0], [0, 1, 1]]
lock = [[1, 1, 1], [1, 1, 0], [1, 0, 1]]
print(solution(key, lock)) # True
# 열쇠가 모두 1이고 자물쇠가 모두 0일때
key = [[1, 1, 1], [1, 1, 1], [1, 1, 1]]
lock = [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
print(solution(key, lock)) # True
# 자물쇠의 구멍이 열쇠보다 클때
key = [[1, 0, 0], [0, 0, 0], [0, 0, 0]]
lock = [[0, 0, 0], [1, 1, 1], [1, 1, 1]]
print(solution(key, lock)) # False
# 열쇠가 자물쇠와 맞을수 없을때
key = [[1, 1, 0], [1, 1, 0], [0, 0, 0]]
lock = [[1, 0, 0], [0, 1, 0], [1, 1, 1]]
print(solution(key, lock)) # False
True
True
False
False
한시간 정도 어떻게 풀어야하나 고민하다가
풀이 방법의 아이디어만 보고 코드 작성은 직접 해보기로했다.
이건 뭐 크기의 3배 배열을 만들어서 하는 방법으로 푸는데
혼자서는 떠올리기 매우 힘들었을것같다.
문제 풀이 방법이 정말 떠오르지 않는다면 문제풀이의 아이디어만 보고 문제를 푸는게 좋은 방법인 것 같다.
부분별로 연산을 요하는 문제에 활용할 수 있을것같다.