티스토리 뷰

728x90
반응형

문제

https://programmers.co.kr/learn/courses/30/lessons/60059?language=python3 

 

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

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

programmers.co.kr

 

코드

def rotation(key):
    ret = [[0] * len(key) for _ in range(len(key))]
    for i in range(len(key)):
        for j in range(len(key)):
            ret[j][len(key) -1 -i] = key[i][j]
    return ret
        
def check(arr, key, lock):
    for i in range(len(key)-1, len(key) + len(lock)-1):
        for j in range(len(key)-1, len(key) + len(lock)-1):
            if arr[i][j] != 1:
                return False
    return True
    
def reset(key, lock):
    leng = len(key) * 2 + len(lock) - 2
    arr = [[0] * leng for _ in range(leng)]
    for a in range(len(lock)):
        for b in range(len(lock)):
            arr[a + len(key) -1][b + len(key) -1] = lock[a][b]
    return arr

def solution(key, lock):
    key_len = len(key)
    lock_len = len(lock)
    
    for i in range(key_len + lock_len -1):
        for j in range(key_len + lock_len -1):
            for k in range(4):
                arr = reset(key, lock)
                key = rotation(key)
                for x in range(key_len):
                    for y in range(key_len):
                        arr[x+i][y+j] += key[x][y]
                chk = check(arr, key, lock)
                if chk:
                    return True
    return False

key * 2 + lock -2 크기만큼에 배열을 새로만들어서 lock은 배열 가운데에 넣어놓고 key를 상하좌우 이동과 회전을 통해서 자물쇠 범위가 모두 1일때 성공하는 문제이다..

 

새로만든 배열 arr 처음부터 key길이 + lock 길이 -1 까지만 돌아주면서 (이 위치부터 key값을 넣어야함)

reset과 rotation을 동시에 진행하면서 계속 check 함수를 통해 lock 범위가 모두 1에 값인지 확인해 모두 1에 값이면 자물쇠와 열쇠가 맞는 값이므로 true를 반환한다.

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28