이코테-chapter12: 구현 문제-자물쇠와 열쇠

문제

코드

# https://programmers.co.kr/learn/courses/30/lessons/60059
# 난이도: 중, 메모리 제한: 128MB, 2020 kakao 신입 공채 기출
def rotate_a_matrix_by_90_degree(a: list) -> list:
    n = len(a)  # 행 길이 연산
    m = len(a[0])  # 열 길이 연산
    result = [[0] * n for _ in range(m)]  # 결과 리스트

    for i in range(n):
        for j in range(m):
            result[j][n-i-1] = a[i][j]

    return result

# 자물쇠의 중간 부분이 모두 1인지 확인
def check(new_lock) -> bool:
    lock_length = len(new_lock) // 3

    for i in range(lock_length, lock_length*2):
        for j in range(lock_length, lock_length*2):
            if new_lock[i][j] != 1:
                return False
    return True

def solution(key: list, lock: list) -> bool:
    n = len(lock)
    m = len(key)
    # 자물쇠의 크기를 기존의 3배로 변환
    new_lock = [[0] * (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]

    # 4가지 방향에 대해서 확인
    for _ in range(4):
        key = rotate_a_matrix_by_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


if __name__ == '__main__':
    print(solution([[0,0,0], [1,0,0], [0,1,1]], [[1, 1, 1], [1, 1, 0], [1, 0, 1]]))  # true

출처 & 깃허브

programmers 자물쇠와 열쇠
이것이 취업을 위한 코딩 테스트다 with python
github

좋은 웹페이지 즐겨찾기