띠리링구 2022. 5. 14. 01:55

코딩테스트 연습 - 자물쇠와 열쇠 | 프로그래머스 (programmers.co.kr)

 

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

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

programmers.co.kr

 

곧 2시에 롤약속이 있어서 최대한 빠르게 코딩했고 25분컷을 냈다.

이미 풀어본 문제라 확실히 첨풀때보다 쉽다

 

import copy

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

def check(lock, key, x, y):
    lock = copy.deepcopy(lock)
    
    K = len(key)
    for i in range(K):
        for j in range(K):
            lock[x + i][y + j] += key[i][j]
    
    L = len(lock)

    for i in range(K, L - K):
        for j in range(K, L - K):
            if lock[i][j] != 1:
                return False
    
    
    return True

def solution(key, lock):
    K = len(key)
    L = len(lock)
    
    keys = []
    for i in range(4):
        keys.append(key)
        key = rotate(key)
    
    newlock = [[0] * (2 * K + L) for _ in range(2 * K + L)]
    for i in range(L):
        for j in range(L):
            newlock[i + K][j + K] = lock[i][j]
    lock = newlock
    
    for i in range(1, K + L):
        for j in range(1, K + L):
            for key in keys:
                if check(lock, key, i, j):
                    return True
                
    return False

 

참고로 이문제는 정답률 7%정도였다.