파이썬으로 부시자! Python with Coreenee

프로그래머스 - 자물쇠와 열쇠 - 구현

문제

스크린샷 2020-09-08 오후 11 59 40

입력

스크린샷 2020-09-08 오후 11 59 49


나의 처음 코드

좌표를 회전시키는 방법과 열쇠를 옮겨가면서, 자물쇠와의 일치여부를 확인해주어야 한다.


풀이 사진

개발-131

def rotate(arr, ith, m):
    if ith == 0:
        return arr
    dx = []
    dy = []
    new_arr = []
    for pos in arr:
        if ith == 1:
            new_arr.append((pos[1], m - pos[0] - 1))
        elif ith == 2:
            new_arr.append((m - pos[0] - 1, m - pos[1] - 1))
        else:
            new_arr.append((m - pos[1] - 1, pos[0]))
    return new_arr


def solution(key, lock):
    answer = True
    key_list = []
    lock_dict = {}
    lock_set = set()
    all_set = set()
    M = len(key)
    N = len(lock)

    for i in range(N):
        for j in range(N):
            all_set.update({(M - 1 + i, M - 1 + j)})
            if lock[i][j] == 0:
                lock_set.update({(M - 1 + i, M - 1 + j)})
    for i in range(M):
        for j in range(M):
            if key[i][j] == 1:
                key_list.append((i, j))
    key_dict = set()
    for ith in range(1, 4):
        new_arr = rotate(key_list, ith, M)
        for i in range(M + N):
            for j in range(M + N):
                for x, y in new_arr:
                    key_dict.update({(x + i, y + j)})
                if all_set.intersection(key_dict) == lock_set:
                    return True
                key_dict.clear()
    return False

set에 여러 데이터를 update하기 위해서는 {} 로 묶어줘야 원하는 방향으로 작동을 한다.

key_dict.update((x + i, y + j)) #둘이 같을 경우 하나만 업데이트 됨
key_dict.update({(x + i, y + j)}) #좌표로써 업데이트 됨