💻 링크
https://school.programmers.co.kr/learn/courses/30/lessons/60059

📖 문제 해결
키를 회전하고 이동하며 넣어보는 모든 경우의 수를 계산하는 완전 탐색 방법을 이용하여 문제를 해결하였습니다. 이 문제에서는 보통의 키와 자물쇠와는 달리 키가 자물쇠 안에 쏙 들어오게 넣지 않아도 됩니다. 즉, 키가 자물쇠 옆으로 삐져나온 형태로 넣어도 됩니다. 따라서 삐져나온 모든 경우의 수를 수월하게 계산하기 위하여 자물쇠의 가로의 길이와 세로의 길이 보다 각각 세 배씩 긴 0으로 된 리스트의 한 가운데에 자물쇠를 넣어 놓은 변형된 형태의 자물쇠 transform_lock 을 문제에서 활용하였습니다. 또한 코드를 간결하게 작성하기 위하여 키를 90도씩 회전하는 rotate_90() 함수와 키와 자물쇠가 딱 맞는지 확인하는test()함수를 따로 작성하여 solution()함수에서 사용할 수 있도록 하였습니다.

# 키를 90도 돌리는 함수
def rotate_90(key) :
    rot_mat = [[0] * len(key) for _ in range(len(key))]
    
    for r in range(len(key)):
        for c in range(len(key)):
            rot_mat[c][len(key)-1-r] = key[r][c]
    
    return rot_mat

# 키와 자물쇠가 딱 맞는 지 확인하는 함수
def test(lock):

    n = len(lock)
    n = n // 3
    
    for r in range(n,n*2):
        for c in range(n,n*2):
        
        	# 모든 값이 1이어야 키와 자물쇠가 딱 맞는 것이므로
            if lock[r][c] != 1 :
                return False
    
    return True

# solution 함수
def solution(key, lock):
    
    n = len(lock)
    m = len(key)
    
	# 자물쇠의 형태를 변형
    transform_lock = [[0]*(n*3) for _ in range(n*3)]

    for i in range(n,n*2):
        for j in range(n,n*2):
            transform_lock[i][j] = lock[i-n][j-n]
    
    # 4가지 회전 방향에 대하여 확인
    for i in range(4):
        key = rotate_90(key)

        for l_row in range(n*2):
            for l_col in range(n*2):
           
				# 자물쇠에 키를 넣어 보기
                for k_row in range(m):
                    for k_col in range(m):
                        transform_lock[l_row+k_row][l_col+k_col] += key[k_row][k_col]
						
                        # 만약 키와 자물쇠가 딱 맞는다면 True 반환
                        if test(transform_lock):
                            return True
				
                # 자물쇠에 넣어 보았던 키를 다시 빼기
                for k_row in range(m):
                    for k_col in range(m):
                        transform_lock[l_row+k_row][l_col+k_col] -= key[k_row][k_col]
      
    # 만약 모든 경우에 대하여 키와 자물쇠가 맞지 않다면 False 반환
    return False
profile
AI를 공부하고 있는 학생입니다:)

0개의 댓글