본문 바로가기
알고리즘 & PS

[Python] 프로그래머스 Lv 3 - 자물쇠와 열쇠(2020 카카오 코테 기출)

by 다람이도토리 2021. 4. 24.

2020 카카오 블라인드 채용 코테 기출문제 자물쇠와 열쇠 풀이

어려운 아이디어 보다는 쌩 구현력을 묻는 문제로, 리스트가 왔다갔다 하는 상황이 많아서, 어떻게 대처해야 할지를 잘 고려해야 하는 문제이다. 함수로 잘 쪼개야 한다. 다행히 좌표 장난질은 덜하되,


알고리즘

(1) 일단, 열쇠가 삐져나와도, 구멍에만 정확하게 맞게 끼워주면 된다는 의미는, 열쇠가 바깥으로 벗어날 수 있다는 점이다.따라서, 자물쇠의 판을 넓혀서 양쪽으로 열쇠가 자연스럽게 들어갈 수 있게 해주자.

(2) 열쇠를 1번 돌려서 넓게 핀 자물쇠칸 각 칸에 모두 꽂아보고, 안되면 열쇠 돌리고 총 열쇠를 4번 돌려서 다 안되면 실패로 False를 return 해버린다. 이 때, 자물쇠의 첫 칸을 변수로 줘서 다음 번 시도에도 편리하게 넣을 수 있도록 해주자.

(3) 열쇠를 넣는 함수, 빼는 함수, 체크하는 함수, 돌리는 함수를 모두 구분해서 넣으면 깔끔하다.


코드

def attach_key(x, y, k_size, key, lock_board):
    for i in range(k_size):
        for j in range(k_size):
            lock_board[x+i][y+j] += key[i][j]
    return lock_board

def detach_key(x, y, k_size, key, lock_board):
    for i in range(k_size):
        for j in range(k_size):
            lock_board[x+i][y+j] -= key[i][j]
    return lock_board

def correct_lock(lock_board, k_size, l_size):
    for i in range(l_size):
        for j in range(l_size):
            if lock_board[i+k_size][j+k_size] != 1:
                return False
    return True

def rotation(key):
    return list(zip(*key[::-1]))

def solution(key, lock):
    # 0단계 변수 선택
    k_size, l_size = len(key), len(lock)
    lock_board = [[0 for _ in range(2*l_size + k_size)] for _ in range(2*l_size + k_size)]
    
    # 1단계. 초기 보드 세팅, 자물쇠 중앙 배치
    for i in range(0, l_size):
        for j in range(0, l_size):
            lock_board[i+k_size][j+k_size] = lock[i][j]
    
    # 2단계 key의 회전과 이동
    for _ in range(4):
        key = rotation(key)
        for x in range(0, l_size+k_size):
            for y in range(0, l_size+k_size):
                lock_board = attach_key(x, y, k_size, key, lock_board)
                if correct_lock(lock_board, k_size, l_size):
                    return True
                lock_board = detach_key(x, y, k_size, key, lock_board)

    return False