Algorithm/프로그래머스

프로그래머스 자물쇠와 열쇠 문제 풀이 - [세무민의 코딩일기]

세기루민 2022. 5. 17. 00:08
728x90

ㅋ안녕하세요 세기무민입니다.

이번에 풀어볼 문제는 2020년도 카카오 블라인트 문제 중 하나인 자물쇠와 열쇠 문제입니다. 

 

문제 설명

 

입출력 예시

 

문제 풀이

흠.... 개인적으로 일단 이번 문제에서 포인트는 배열 회전하는 것이라고 생각한다. 

파이썬에서 배열 회전에 사용되는 내장 함수 중 Zip이라고 있는데 이걸 사용하여

0 / 90 / 180 / 270도 회전하여 한번씩 key를 넣어보면 되는 문제이다. 

아래의 그림으로 좀더 쉽게 설명해보면 

간단한 예시로 Lock과 Key의 값은 위와 같고 0도부터 하나씩 Lock에 Key를 넣어줍니다. 

넣었을 때 Lock의 모든 값이 1이라면 True를 반환해주면 되고 

0, 90, 180, 270도 회전하여 동일하게 하나씩 탐색했음에도 불구하고 모든값이 1인 경우가 없다면 False!

 

코드


import numpy as np

def rotate_key(keys):
    rotated = np.array(list(zip(*keys[::-1])))
    return rotated

def solution(key, lock):
    key_num = len(key)
    lock_num = len(lock)
    
    arrays = [[0] * (key_num * lock_num) for i in range(key_num * lock_num)]    
    for i in range(lock_num):
        for j in range(lock_num):
            arrays[key_num+i][key_num+j] = lock[i][j] 
            
    key_rotate = key  
    for i in range(4):
        key_rotate = rotate_key(key_rotate)
        for j in range(key_num + lock_num):
            for z in range(key_num + lock_num):
                key_chk = 0
                for a in range(key_num):
                    for b in range(key_num):
                        arrays[j+a][z+b] += key_rotate[a][b]
                
                for a in range(lock_num):
                    for b in range(lock_num):
                        if arrays[key_num+a][key_num+b] != 1:
                            key_chk += 1

                if key_chk == 0:
                    return True
                
                for a in range(key_num):
                    for b in range(key_num):
                        arrays[j+a][z+b] -= key_rotate[a][b]
                            
                
    return False

요약정리를 하자면 아래와 같다.

1. Rotate_Key(zip)를 이용하여 key값을 90도씩 회전을 한다.

2. 회전한 뒤 해당 Lock에 Key를 넣어본 뒤 모든 값이 1인 경우라면 True,

그렇지 않은 경우라면 기존 Lock으로 원복해주면서 하나씩 전체탐색을 진행한다.

 

결과 및 GitHub

[GITHUB]

 

GitHub - sg-moomin/algorithmStudy_CodingTest

Contribute to sg-moomin/algorithmStudy_CodingTest development by creating an account on GitHub.

github.com


최근에 코딩테스트를 봤었는데....

처참한 나의 실력을 보면서 좀 더 열심히 코테 준비해야겠다는 생각이 들었네요...

준비를 별로 안하고 시험 본 나의 잘못도 있지만,

뭔가 직장다닌다고 맨날 코테 공부를 안했던 나의 무지함도 컸던거 같네요..

무튼 다음에는 더 유익한 정보로 찾아오겠습니다.

728x90