kiteday 님의 블로그

[프로그래머스-파이썬] 자물쇠와 열쇠 본문

코딩테스트

[프로그래머스-파이썬] 자물쇠와 열쇠

kiteday 2025. 12. 1. 15:39
반응형
SMALL

https://school.programmers.co.kr/learn/courses/30/lessons/60059

 

 

이 코드는 1. 열쇠를 90도씩 회전해가면서 2. 자물쇠와 일치하는지 확인하는 과정이 필요하다.

어렵다기 보다 범위 연산을 잘 해줘야하는 문제.

def check(key, lock, n):
    for x in range(len(lock)-len(key)+1):
        for y in range(len(lock)-len(key)+1):
            for a in range(len(key)):
                for b in range(len(key)):
                    lock[x+a][y+b] += key[a][b]
                    
            flag = True
            for a in range(n):
                for b in range(n):
                    if lock[len(key)-1+a][len(key)-1+b] != 1:   
                        flag = False
                        break
                if not flag:
                    break
            
            for a in range(len(key)):
                for b in range(len(key)):
                    lock[x+a][y+b] -= key[a][b]
            
            if flag:
                return True
    
    return False

def rotate(key):
    m = len(key)
    new_key = [[0 for _ in range(m)]for _ in range(m)]
    for x in range(m):
        for y in range(m):
            new_key[y][m-1-x] = key[x][y]

    return new_key

def solution(key, lock):
    answer = False
    m = len(key)
    n = len(lock)
    board = [[0 for _ in range(2*(m-1)+n)] for _ in range(2*(m-1)+n)]
    
    for x in range(m-1, m-1+n):
        for y in range(m-1, m-1+n):
            board[x][y] = lock[x-(m-1)][y-(m-1)]
    
    
    for i in range(4):
        if check(key, board, n):
            return True
        key = rotate(key)
    
    return answer

 

rotate나 solution 함수를 만드는 건 어렵지 않았는데 check함수는 많이 헷갈렸었다.

크게 실수한 부분은 자물쇠에 열쇠를 넣어보고 안맞으면 그걸 빼야한다는 것. 빼는 코드가 없어서 오답이었다.

LIST