1. 문제
- 프로그래머스 문제
- N x N 자물쇠가 있고, M x M 의 열쇠가 있다.
- 좌물쇠도 0, 1, 열쇠도 0, 1로 이루어져 있다.
- 열쇠는 회전과 수평, 수직 이동이 가능하다.
- 회전, 수평, 수직 이동으로 좌물쇠의 홈에, 열쇠의 돌기만 맞추어야 한다.
- 돌기와 돌기가 맞으면 안된다.
- 자물쇠를 열수 있으면 True, 열수 없으면 False 를 반환하는 프로그램을 만들라.
제한사항 및 입출력 예
2. 아이디어
- 효율성을 따지지 않기 때문에 완전탐색 방법을 사용한다.
- 자물쇠 2차원 리스트를 3배 크기로 크게 만들어서 열쇠를 한칸씩 오른쪽 아래로 이동시키면서 차례차례 열쇠가 맞는지 확인한다.
- 90도 회전, 열쇠가 맞았는지 확인하는 함수를 만든다.
- 열쇠 2차원 리스트를 왼쪽 최상단에서, 오른쪽 최하단까지 한칸씩 이동시키면서, 자물쇠에 더한다.
- 자물쇠 리스트의 모든 부분이 1인지 확인한다.
- 아니면, 다시 열쇠를 제거한다. (더했던 것을 다시 뺀다.)
3. 예제코드
def rotate_a_matrix_by_90_degree(a):
n = len(a)
m = len(a[0])
result = [[0] * n for _ in range(m)]
for i in range(n):
for j in range(m):
result[j][n - i - 1] = a[i][j]
return result
def check(new_lock):
lock_length = len(new_lock)//3
for i in range(lock_length, lock_length *2):
for j in range(lock_length, lock_length *2):
if new_lock[i][j] != 1:
return False
return True
def solution(key, lock):
n = len(lock)
m = len(key)
new_lock = [[0]*(n*3) for _ in range(n*3)]
for i in range(n):
for j in range(n):
new_lock[i+n][j+n] = lock[i][j]
for rotation in range(4):
key = rotate_a_matrix_by_90_degree(key)
for x in range(n*2):
for y in range(n*2):
for i in range(m):
for j in range(m):
new_lock[x+i][y+j] += key[i][j]
if check(new_lock) == True:
return True
for i in range(m):
for j in range(m):
new_lock[x+i][y+j] -= key[i][j]
return False
느낀점
- 2차원 리스트를 자다가 바로 일어나서도 가지고 놀줄 알아야 한다.
참고
- 이것이 취업을 위한 코딩 테스트다. with 파이썬