찔끔찔끔씩😎

[프로그래머스] 자물쇠와 열쇠 - python (2020 카카오 블라인드 코딩테스트) 본문

Algorithm/프로그래머스

[프로그래머스] 자물쇠와 열쇠 - python (2020 카카오 블라인드 코딩테스트)

댕경 2021. 11. 2. 15:10
728x90

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


문제

열쇠를 자물쇠에 맞춰라.

열쇠는 회전이 가능하다.


해결

함수 구성

1. rotate

: 90 도 회전 함수

2. attach

: new_lock 에 key 값을 넣어준다

3. check

: lock 의 값이 모두 1인지 판별한다

4. detach

: 모두 1이 아니라면 원래의 new_lock으로 되돌려 준다

5. solution (main 함수)

 

설명

우선, 열쇠가 다 들어 갈 수있는 "lock" 3배 크기의 "new_lock" 을 만들어준다. 

가운데에 lock을 위치 시켜준뒤 그 곁을 key 가 반복문으로 순회하며 맞는지 판단한다. ( attach + check )

맞지 않는다면 다시 원래의 new_lock으로 되돌려 준다 . ( detach )

한바퀴 순회했을 때 답이 없다면 90도 회전한뒤 다시 실행한다. ( rotate ) 

 

 


코드

def rotate(a): # 90도 회전 함수
    n = len(a)
    result = [[0] * n for _ in range(n)]
    for i in range(n):
        for j in range(n):
            result[j][n - i - 1] = a[i][j]
    return result

def attach(i,j,key_len,new_lock,key): # new_lock에 넣어보기
    for x in range(key_len):
        for y in range(key_len):
            new_lock[x+i][y+j]+=key[x][y]

def check(new_lock,lock_len): # lock 이 풀리나 check
    for i in range(lock_len, lock_len*2):
        for j in range(lock_len,lock_len*2):
            if new_lock[i][j]!=1 :
                return False
    return True

def detach(i,j,key_len,new_lock,key): # new_lock에서 다시 없애기
    for x in range(key_len):
        for y in range(key_len):
            new_lock[x+i][y+j]-=key[x][y]



def solution(key, lock):
    key_len = len(key)
    lock_len = len(lock)

    new_lock = [[0] * (lock_len * 3) for _ in range(lock_len * 3)]

    for i in range(lock_len): # 중앙에 lock 위치 
        for j in range(lock_len):
            new_lock[i + lock_len][j + lock_len] = lock[i][j]
            
    
    for _ in range(4): 
        key = rotate(key) # 90도 회전
        for i in range(1, lock_len*2):
            for j in range(1, lock_len*2):
                attach(i,j,key_len,new_lock,key) # new_lock + key
                if check(new_lock,lock_len): 
                    return True 
                else:
                    detach(i,j,key_len,new_lock,key) # new_lock - key
    
    return False
Comments