어디까지 갈 수 있을까?

[구현] 프로그래머스 자물쇠와 열쇠 본문

알고리즘/문제

[구현] 프로그래머스 자물쇠와 열쇠

_Min 2021. 5. 1. 19:32

문제링크 programmers.co.kr/learn/courses/30/lessons/60059

 

 

 

[답코드]

import copy

def rotate(key):
    copy_key=copy.deepcopy(key)
    for i in range(len(key)):
        for j in range(len(key)):
            copy_key[j][-i-1]=key[i][j]
    return copy_key

def check(n, m, copy_lock):
    for i in range(m, n+m):
        for j in range(m, n+m):
            if copy_lock[i][j]!=1:
                return False
    return True
    
def add(i, j, copy_lock, key):
    for k in range(len(key)):
        for l in range(len(key)):
            copy_lock[i+k][j+l]+=key[k][l]
    return copy_lock    

def solution(key, lock):
    n, m=len(lock), len(key)
    
    lock=[[0]*n]*m+lock
    lock=lock+[[0]*n]*m
    for i in range(len(lock)):
        lock[i]=[0]*m+lock[i]
        lock[i]=lock[i]+[0]*m
    
    for _ in range(4):
        for i in range(n+m):
            for j in range(n+m):
                copy_lock=copy.deepcopy(lock)
                copy_lock=add(i, j, copy_lock, key)
                if check(n, m, copy_lock):
                    return True
        
        key=rotate(key)
    
    return False

 

 

[풀이법]

[[0]*n]*m 를 작성할 때 n은 열로, m은 행으로 생각하고 작성했다.

테스트 케이스 15번만 틀렸는데 키값이 [[1]] 자물쇠값이 [[0]] 일 때를 시도해보면 대부분 고칠 수 있을 것 같다

열쇠의 돌기 부분과 자물쇠의 돌기가 만나선 안 되기 때문에 check 함수를 수행할 때 copy_lock이 0인 부분 & 2인 부분이 모두 있으면 안 된다

 

 

728x90
Comments