본문 바로가기

Archived(CSE Programming)/알고리즘(Python)

프로그래머스 - 자물쇠와 열쇠 (파이썬, LV3)

  https://programmers.co.kr/learn/courses/30/lessons/60059

 

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

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

programmers.co.kr

2020 KAKAO 문제

 

간과했던 내용

  • Lock과 Key의 크기가 다를 수 있던 점
  • Board(전체 배열)의 크기는 Lock의 2배가 아닌 3배여야 한다는 점
  • 회전 배열이 바로 안떠올랐던 점(값을 적어서 확인해봄)
  • 돌기끼리 부딪혀도 안된다는 점(무조건 매끄러운 1이 되야함, 2도 안됨)

 

풀이

  • 자물쇠 3배 크기의 전체 배열을 구성한다.
  • 해당 전체 배열에서 자물쇠를 중간(start~end) 부분에 값을 옮긴다.
  • 그리고 키를 움직이고 또 회전하며 자물쇠 영역이 전부 1이 되는지 체크한다.
# 배열 rotation
def rotation(arr):
    retArr = [[0] * len(arr)  for _ in range(len(arr))]
    # 11 > 13 / 12 > 23 / 13 > 33
    for i in range(len(arr)):
        for j in range(len(arr)):
            retArr[j][len(arr)-1-i] = arr[i][j]
    return retArr

# 정값 체크
def checkSol(keyArr, lockArr, x, y):
    keySize = len(keyArr)
    lockSize = len(lockArr)
    
    boardSize = lockSize*3 
    board = [[0]*(boardSize) for _ in range(boardSize)]
    
    start = lockSize -1
    end = start + lockSize
    
    # boardArr 에 lock 삽입
    for i in range(lockSize):
        for j in range(lockSize):
            board[start+i][start+j] += lockArr[i][j]        
    
    # boardArr 에 key 삽입
    for i in range(keySize):
        for j in range(keySize):
            board[i+x][j+y] += keyArr[i][j]   # 값 복사
    
    # 전부 1인지 체크
    for i in range(start, end):
        for j in range(start, end):
            if board[i][j] != 1 :
                return False
    return True

# 메인함수
def solution(key, lock):
    
    # 4회전 하면서 체크
    for _ in range(4):
        
        # 값 이동
        for x in range((len(lock)*2)-1):
            for y in range((len(lock)*2)-1):
                if checkSol(key, lock, x, y) == True :
                    return True

        # key 회전
        key = rotation(key)
        
    return False