문제: https://programmers.co.kr/learn/courses/30/lessons/60059? 

 

코딩테스트 연습 - 자물쇠와 열쇠

[[0, 0, 0], [1, 0, 0], [0, 1, 1]] [[1, 1, 1], [1, 1, 0], [1, 0, 1]] true

programmers.co.kr

 

어려웠던 문제다. 어떻게 시작해야할지 감도 안 잡혔던 문제. 

찾아보니 lock보다 3배 큰 행렬을 만들고, 그 중간에 lock 행렬을 넣고 주변에서 key를 움직이면서 값을 더한후 중간 lock행렬의 값이 모두 1일 때 True를 반환하는 방식이었다 

코딩테스트 준비는 정말 쉽지 않은 것 같다 

 

-정답풀이

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(n):
        	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,2*lock_length):
    	for j in range(lock_length,2*lock_length):
        	if new_lock[i][j]!=1:
            	return False	
	return True 
    
    
def solution(key,lock):
	n=len(lock)
    m=len(key)
    new_lock=[[0]*3*n for _ in range(3*n)]
    
    for i in range(n,2*n):
    	for j in range(n,2*n):
        	new_lock[i][j]=lock[i][j]
            
	for rotation in range(4):
    	key=rotate_a_matrix_90_degree(key)
        for x in range(2*n):
        	for y in range(2*n):
            #자물쇠에 열쇠 끼어넣기 
            	for i in range(m):
                	for j in range(m):
                    	new_lock[x+i][y+j]+=key[i][j]
                if check[x][y]!=1:
                	return True
                for i in range(m):
                	for j in range(m):
                    	new_lock[x+i][y+j]-=key[i][j]
                        
	return False

+ Recent posts