알고리즘/프로그래머스

[프로그래머스] Level3, 자물쇠와 열쇠 (Python)

wookcode 2021. 8. 10. 15:43
728x90
반응형

문제

https://programmers.co.kr/learn/courses/30/lessons/60059?language=python3 

 

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

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

programmers.co.kr

 

코드

def rotation(key):
    ret = [[0] * len(key) for _ in range(len(key))]
    for i in range(len(key)):
        for j in range(len(key)):
            ret[j][len(key) -1 -i] = key[i][j]
    return ret
        
def check(arr, key, lock):
    for i in range(len(key)-1, len(key) + len(lock)-1):
        for j in range(len(key)-1, len(key) + len(lock)-1):
            if arr[i][j] != 1:
                return False
    return True
    
def reset(key, lock):
    leng = len(key) * 2 + len(lock) - 2
    arr = [[0] * leng for _ in range(leng)]
    for a in range(len(lock)):
        for b in range(len(lock)):
            arr[a + len(key) -1][b + len(key) -1] = lock[a][b]
    return arr

def solution(key, lock):
    key_len = len(key)
    lock_len = len(lock)
    
    for i in range(key_len + lock_len -1):
        for j in range(key_len + lock_len -1):
            for k in range(4):
                arr = reset(key, lock)
                key = rotation(key)
                for x in range(key_len):
                    for y in range(key_len):
                        arr[x+i][y+j] += key[x][y]
                chk = check(arr, key, lock)
                if chk:
                    return True
    return False

key * 2 + lock -2 크기만큼에 배열을 새로만들어서 lock은 배열 가운데에 넣어놓고 key를 상하좌우 이동과 회전을 통해서 자물쇠 범위가 모두 1일때 성공하는 문제이다..

 

새로만든 배열 arr 처음부터 key길이 + lock 길이 -1 까지만 돌아주면서 (이 위치부터 key값을 넣어야함)

reset과 rotation을 동시에 진행하면서 계속 check 함수를 통해 lock 범위가 모두 1에 값인지 확인해 모두 1에 값이면 자물쇠와 열쇠가 맞는 값이므로 true를 반환한다.

반응형