Algorithm/Simulation

[Python] 프로그래머스 '자물쇠와 열쇠'

코딩쪼앙 2023. 1. 20. 15:18

문제

 

프로그래머스

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

programmers.co.kr

문제풀이

  • Key를 90도씩 회전하는 함수 따로 구현
  • 자물쇠의 3배 크기인 지도를 새로 만들기
  • 자물쇠의 홈과 열쇠의 홈이 만나면 값이 1이 되므로 자물쇠에 열쇠를 넣고 모든 부분의 합이 1이 되면 True 한 곳이라도 1이 아니라면 False출력

코드

# key 90도 회전
def rotate_a_matrix_by_90_degree(a):
    n = len(a) #행
    m = len(a[0]) #열
    result = [[0] * m for _ in range(n)] #결과리스트
    for i in range(n):
        for j in range(m):
            result[j][n - i - 1] = a[i][j]
    return result

# 자물쇠가 중간 부분이 1인지 확인
def check(new_lcok):
    lock_length = len(new_lcok) // 3
    for i in range(lock_length, lock_length * 2):
        for j in range(lock_length, lock_length * 2):
            if new_lcok[i][j] != 1:
                return False
    return True

def solution(key, lock):
    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 i in range(4):
        key = rotate_a_matrix_by_90_degree(key) #열쇠 회전
        # 중앙 이후로 확인 필요 x
        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

'Algorithm > Simulation' 카테고리의 다른 글

[Python] 치킨배달  (1) 2023.01.26
[Python] 뱀  (0) 2023.01.25
[Python] 게임 개발  (0) 2023.01.17
[Python] 왕실의 나이트  (0) 2023.01.17
[Python] 시각  (0) 2023.01.16