코딩,안되면 될때까지

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

프로그래머스/프로그래머스-파이썬

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

soo97 2022. 3. 15. 10:58
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.열쇠와 자물쇠가 맞는지 확인하는 방법 : 열쇠를 자물쇠에 맞춘 다음 자물쇠의 모든 원소값이 1이면 된다.

2.자물쇠의 영역을 벗어나는 부분은 신경쓰지 않는다 했으므로 자물쇠의 (0,0)위치 부터 (n,n)위치까지 열쇠를 맞춰보면 된다.

3. 이때 코드를 간단하게 구현하기 위해 자물쇠의 영역을 3배씩 늘려준다.

4.이 문제를 풀때 2차원 리스트를 90도 회전하는 코드를 구현해야하는데 이부분은 다른 문제를 풀때도 유용하게 쓰이므로 알아두면 좋을 거 같다.

# 2차원 리스트 90도 회전 함수
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
                 
  0 0 0          
  1 0          
  1 1+1->2 1 1      
      1 1 0      
      1 0 1      
                 
                 
                 

자물쇠의 (0,0)위치에 열쇠를 넣었더니 자물쇠의 (0,0)의 합이 2가 됨을 알 수 있다.(False)

이와 같이 자물쇠의 모든위치에 열쇠를 넣어봄으로써 결과를 확인 할 수 있다.

<코드>-파이썬

# 2차원 리스트 90도 회전 함수
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

#자물쇠의 중간부분이 모두 1인지 확인
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]
    
    #4가지 방향에 대해서 확인
    for rotation in range(4):
        key = rotate_a_matrix_by_90_degree(key)
        for x in range(1,n*2):
            for y in range(1,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
728x90
반응형

'프로그래머스 > 프로그래머스-파이썬' 카테고리의 다른 글

[프로그래머스]-괄호변환  (4) 2022.03.12
무지의 먹방 라이브  (0) 2022.02.26
조이스틱  (0) 2022.02.26
타겟넘버  (0) 2022.02.26
2.오픈채팅방  (0) 2022.01.13
Comments