상상쓰

[프로그래머스] 자물쇠와 열쇠 본문

Coding Test

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

상상쓰 2021. 6. 2. 17:59

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

 

뭔가 복잡하여 단순하게 계산하기 위해서 lock 을 2 * (m - 1) + n 길이의 배열로 만들어 key 와 비교를 했다.

자물쇠의 홈 부분의 개수를 N 으로 하고 키의 돌기 부분이 자물쇠의 홈 부분을 만나는 횟수를 C 로 해서 비교해서 같으면 True 를 반환하고 모든 동작을 break 한다. 자물쇠와 키의 돌기 부분이 만나는 경우는 False 인 경우로 break 후 다른 경우로 넘어간다. 

 

 

def solution(key, lock):
    answer = False
    m, n = len(key), len(lock)
    array = [[0] * (2*(m-1)+n) for i in range(2*(m-1)+n)]
    N, C = 0, 0
    
    for i in range(n):
        for j in range(n):
            array[m-1+i][m-1+j] = lock[i][j]
            if lock[i][j] == 0:
                N = N + 1
    
    for _ in range(4):
        if answer:
            break
            
        key = rotate90(key)
        x, y = 0, 0

        while x <= m+n-2 and y <= m+n-2:
            for i in range(m):
                if C < 0: break
                
                for j in range(m):
                    if m-1<= x+i <= m+n-2 and m-1 <= y+j <= m+n-2:
                        if array[x+i][y+j] == 0 and key[i][j] == 1:
                            C = C + 1
                        else:
                            if array[x+i][y+j] == 1 and key[i][j] == 1:
                                C = -1
                                break
            
            if N == C:
                answer = True
                break
            else:
                C = 0
                
                if x < m+n-2:
                    x = x + 1
                else:
                    y = y + 1
                    x = 0
                    
    return answer
                    
def rotate90(key):
    m = len(key)
    key_ = [[0] * m for i in range(m)]
    
    for i in range(m):
        for j in range(m):
            key_[j][m-i-1] = key[i][j]
    
    return key_

print(solution([[0, 0, 0], [1, 0, 0], [0, 1, 1]], [[1, 1, 1], [1, 1, 0], [1, 0, 1]])) # True
Comments