[프로그래머스] 자물쇠와 열쇠 (Python 파이썬)

dh·2022년 12월 26일
0
post-thumbnail


자물쇠를 key에 맞게 확장하여 key를 확장된 자물쇠의 [0,0] 부터 [n,n]까지 이동 시킨다.
1. key가 lock과 맞는지 확인
2. 맞으면 True 리턴 맞지 않으면 90도 회전 후 다시 확인
3. 2.과정을 4번 반복해 360도 회전해도 키가 맞지 않으면, 다음 칸으로 키를 이동
위 과정을 반복해 키가 맞으면 True를 리턴 맞지않으면 끝까지 가서 False를 리턴

얕은 복사 방법인 temp = new_lock으로 리스트를 복사시 temp의 값을 변경시킬때 원본인 new_lock의 값도 그대로 변경이 됐다.
temp = new_lock[:] or temp = new_lock.copy()를 사용해도 원본이 바꼈다.
리스트안에 존재하는 list, set, dictionary같은 변형 객체는 메모리 주소가 같아서 값이 똑같이 변경된다.
그래서 깊은 복사를 이용서 해결할 수 있었다.

파이썬 얕은복사 깊은복사 참조
https://blockdmask.tistory.com/576

코드

import copy

def solution(key, lock):
    m = len(key)
    n = len(lock)
    new_lock = [[0 for _ in range((n+(m*2)-2))] for _ in range(n+(m*2)-2)]
	
    # 자물쇠 확장
    for i in range(m-1,m+n-1):
        for j in range(m-1,m+n-1):
            new_lock[i][j] = lock[i-(m-1)][j-(m-1)]
            
	# 자물쇠가 처음에 모두 1인 경우 체크
    if check(new_lock,m,n):
        return True
    
    for i in range(m+n-1):
        for j in range(m+n-1):
            for _ in range(4):
                temp = copy.deepcopy(new_lock)
                for k in range(m):
                    for l in range(m):   
                        temp[k+i][l+j] += key[k][l]
                        if temp[k+i][l+j]>=2:
                            continue
                        ch = check(temp,m,n)
                        if ch:
                            return True
                key = rotate(key)
    return False

#회전
def rotate(key):
    key = list(zip(*key[::-1]))
    return key
    
#자물쇠 열리는지 확인
def check(new_lock,m,n):
    hap = 0
    for i in range(m-1,m+n-1):
        if [1]*n != new_lock[i][m-1:m+n-1]:
            return False
    return True

0개의 댓글