[프로그래머스 스터디] 자물쇠와 열쇠

MinTa·2022년 3월 2일
0
post-thumbnail

문제

프로그래머스 자물쇠와 열쇠

풀이

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

            
def unlock_check(board,lock,lock_margin):
    for i in range(len(lock)):
        for j in range(len(lock)):
            if board[lock_margin + i][lock_margin + j] != 1:
                return False
    return True


def solution(key, lock):
    lock_margin = len(key) - 1
    max_length = 58 # 최대치 20 20 20, 거기에 겹쳐있어야하는 부분 최소 한곳은 존재 : -1 두번
    
    
    for i in range(lock_margin + len(lock)):
        for j in range(lock_margin + len(lock)):
            # 회전 4번
            for _ in range(4):
                board = [[0] * max_length for _ in range(max_length)]
                
                # lock 배치
                for l in range(len(lock)):
                    for k in range(len(lock)):
                        board[lock_margin + l][lock_margin + k] = lock[l][k]
                        
                # key 배치
                for kl in range(len(key)):
                    for kj in range(len(key)):
                        board[i + kl][j + kj] += key[kl][kj]
                
                # unlock 확인
                if unlock_check(board,lock,lock_margin):
                    return True
                key = rotate(key)

                
    return False

요약

  1. 제한사항의 최대치에 맞춘 최대치의 도화지를 미리 설정해놓고 시작한다.
  2. 자물쇠와 열쇠는 최소 한군데는 겹치게끔 한 후에 90도씩 4번을 돌며 돌기가 겹치는 부분 없이 완벽히 들어맞을때까지 모든 경우에 대해 for문을 돈다.
  3. 자물쇠와 열쇠는 최소 한군데는 겹쳐야 검사의 의미가 있으므로 (키의 길이-1) + (자물쇠의 길이)를 기준으로 for문을 도며 4번의 회전에 대해 for문을 돈다.
  4. 후에는 자물쇠의 위치를 먼저 배치하고 이 후에 열쇠의 위치를 배정하며 열쇠가 자물쇠에 들어맞는지를 확인하며 맞지 않을시 rotate, 맞다면 거기서 바로 True를 return한다.
  5. 모든 경우에 대해 탐색을 진행했는데도 True로 return되지 않았다면 자물쇠와 열쇠가 맞지 않는 것이므로 False를 return한다.
profile
지(치지않고)꾸(준히)열(심히)

0개의 댓글