🔗 Problem Link

 

프로그래머스

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

programmers.co.kr


❔Thinking

  • key와 lock이 주어질 때, key를 상하좌우, 회전하여 lock의 홈에 끼워넣을 수 있는지를 반환한다.

💻Solution

def right_rotate_90_degree(key):
    new_key = []
    for i in zip(*key):
        new_key.append(list(reversed(i)))
    return new_key

def check(new_lock):
    n = len(new_lock) // 3
    for i in range(n, n*2):
        for j in range(n, n*2):
            if new_lock[i][j] != 1:
                return False
    return True

def solution(key, lock):
    m = len(key)
    n = len(lock)
    
    # 자물쇠 확장하기
    new_lock = [[0 for _ in range(n*3)] for _ in range(n*3)]
    for i in range(n):
        for j in range(n):
            new_lock[i+n][j+n] = lock[i][j]
            
    # 열쇠 확인하기
    for _ in range(4):
        key = right_rotate_90_degree(key)
        for x in range(n*2):
            for y in range(n*2):
                for i in range(m):
                    for j in range(m):
                        new_lock[x+i][y+j] += key[i][j]
                if check(new_lock) == True:
                    return True
                for i in range(m):
                    for j in range(m):
                        new_lock[x+i][y+j] -= key[i][j]
    return False

🗝️keypoint

  1. 주어진 list 시계방향으로 90도 회전하는 방법은, zip과 reversed를 활용하여 구현할 수 있다.
  2. list 복제는 deepcopy를 활용할 수 있지만, slicing에 비해 속도가 현저히 떨어진다.

+ Recent posts