자물쇠와 열쇠
2020 KAKAO BLIND RECRUITMENT🤎
문제 링크 https://programmers.co.kr/learn/courses/30/lessons/60059
문제 풀이
rotate
는 2차원 배열을 회전해주는 함수이고 for r in range(4)
를 보면 4번 회전할때마다 각 경우를 구하였다. 일단 lock
의 배열을 key
값의 length만큼 크기를 확장시켜주었다. 확장시켜주면서 확장시킨 곳은 0으로 초기화하였다. 그리고 check_lock
이란 new_lock
(lock의 크기를 확장한 배열) 값을 복제시켜주어 회전한 key 와 같은 인덱스 값을 check_lock
자리에 더해주었다. 그리고 모든 key 배열을 순회한 뒤, lock
의 실제 위치 자리를 순회하며 2 or 0
일 때는 실패 그리고 check_lock
을 모두 순회했을때 다 1의 값을 갖는다면 True
로 반환해 주었다.
문제의 키포인트
- lock 이차원 배열을 key length만큼 확장시키기
- lock 이차원 배열을
deepcopy
한 check_lock 이차원 배열 함수 만들기 - check_lock의 실제 lock 부분의 인덱스를 순회하며 올바르게 껴져있는지 확인하기
코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
from copy import deepcopy
def rotate(key,M):
new_key = [[0] * M for _ in range(M)]
for i in range(M):
for j in range(M):
new_key[j][M-1-i] = key[i][j]
return new_key
def solution(key, lock):
answer = True
m = len(key)
n = len(lock)
new_lock = [[0]*(2*m+n) for _ in range(2*m+n)]
for i in range(m,m+n):
for j in range(m,m+n):
new_lock[i][j] = lock[i-m][j-m]
for r in range(4):
key = rotate(key,m)
for i in range(len(new_lock)-m):
for j in range(len(new_lock)-m):
check_lock = deepcopy(new_lock)
for a in range(m):
for b in range(m):
check_lock[a+i][b+j] += key[a][b]
flag = 0
for x in range(m,m+n):
for y in range(m,m+n):
if check_lock[x][y] == 2 or check_lock[x][y] == 0:
flag = 1
break
if flag == 1:
break
if flag == 0:
return True
return False