본문 바로가기

CodingTest/Programmers

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

/  제출 1  /

 

def solution(key, lock):
    answer = False
    
    # 키 끼워넣을 공간 위해서 Lock늘려주기
    n = len(lock)
    new_lock = [[0]*(n+2*(n-1)) for _ in range(n+2*(n-1))]
    
    for i in range(n):
        for j in range(n):
            new_lock[n-1+i][n-1+j] = lock[i][j]

    
        
    # 키 4방향으로 확인
    for i in range(4):
        key = list(map(list, rotate_key(key))) # 시계반대방향회전
        answer = push(key, new_lock)
        if answer:
            break
    
    return answer

def rotate_key(key):
    return list(reversed(list(zip(*key))))

def push(key, lock):
    start = len(key) -1  
    find = False
    lock_save = lock
    
    for x in range(len(lock)-len(key)):
        for y in range(len(lock)-len(key)):
            for i in range(len(key)):
                for j in range(len(key)):
                    lock[x+i][y+j] += key[i][j]
                        
            
            new_lock = []
            for i in range(len(key)):
                new_lock.append(lock[i+len(key)-1][len(key)-1:2*len(key)-1])
            if check(new_lock):
                return True
            for i in range(len(key)):
                for j in range(len(key)):
                    lock[x+i][y+j] -= key[i][j]
            
    return False

def check(lock):
    
    for i in range(len(lock)):
        for j in range(len(lock)):
            if lock[i][j] != 1:
                return False
    return True
채점 결과
정확성: 56.0
합계: 56.0 / 100.0
 
2, 4, 6, 7, 8, 11, 12, 14, 15, 17, 18, 19, 20, 21, 38 실패
 
하.. 이정도는 풀어야 하는거 아닌가.. 한 번 풀어봤던 문제인데.. 속상..
 

/  다른 분 풀이  /

 

def rotate_a_matrix_by_90_degree(a):
    n = len(a)
    m = len(a[0])
    result = [[0] * n for _ in range(m)]
    for i in range(n):
        for j in range(m):
            result[j][n - i - 1] = a[i][j]
    return result

def check(new_lock):
    lock_length = len(new_lock) // 3
    for i in range(lock_length, lock_length * 2):
        for j in range(lock_length, lock_length * 2):
            if new_lock[i][j] != 1:
                return False
    return True

def solution(key, lock):
    n = len(lock)
    m = len(key)
    new_lock = [[0] * (n * 3) for _ in range(n * 3)]
    for i in range(n):
        for j in range(n):
            new_lock[i + n][j + n] = lock[i][j]
            
    for rotation in range(4):
        key = rotate_a_matrix_by_90_degree(key)
        for x in range(n * 2):
            for y in range(n * 2):
                for i in range(m):
                    for j in range(m):
                        new_lock[x + i][y + j] += key[i][j]
                if check(new_lock) == True:
                    return True
                for i in range(m):
                    for j in range(m):
                        new_lock[x + i][y + j] -= key[i][j]
    return False