코딩테스트/구현 및 시뮬레이션

[구현] 자물쇠와 열쇠 - 파이썬

영최 2024. 8. 29. 00:30
728x90

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

✅  배열 초기화 주의 :  for문 돌때마다 deepcopy필요, arr = copy.deepcopy(origin_arr)

✅  rotate할때 4번 돌려야함 (3번 아님)

import copy

def rotate(arr):
    new = [[0]*len(arr) for _ in range(len(arr[0]))]
    for i in range(len(arr)):
        for j in range(len(arr[0])):
            new[j][len(arr)-1-i]=arr[i][j]
    return new

def solution(key, lock):
    n,m = len(lock),len(key)
    len_arr = n+2*(m-1)
    arr = [[0]*len_arr for _ in range(len_arr)]
    for i in range(n):
        for j in range(n):
            arr[m-1+i][m-1+j] = lock[i][j]
            
    rotated = rotate(key)
    origin_arr = copy.deepcopy(arr)
    for _ in range(4):
        for i in range(len_arr-m+1):
            for j in range(len_arr-m+1):
                #배열에 키 더하기
                for k in range(i,i+m):
                    for l in range(j,j+m):
                        arr[k][l]+=rotated[k-i][l-j]
                        
                #잠금장치 확인하기
                flag = False
                total = 0
                for k in range(m-1,m-1+n):
                    for l in range(m-1,m-1+n):
                        if arr[k][l]==2 or arr[k][l]==0:
                            flag=True
                            break
                        else:
                            total+=1
                    if flag:
                        break
                    if total == n*n:
                        return True
                # 배열 초기화
                arr = copy.deepcopy(origin_arr)
                              
        
        rotated = rotate(rotated)
    
    return False
728x90