파이썬 과제

·2021년 5월 22일
0

Project

목록 보기
4/11
post-thumbnail
post-custom-banner

올리는 내용은 과제이다. 별 건 아니지만 했는김에 올려보겠다.

문제

예를 들어 다음과 같은 행렬이 주어져 있을 때

import numpy as np

M = np.arange(20).reshape(4,5)
print(M)

우리의 목표는 다음의 결과에 해당하는 1-d array를 찾는 것이다.

즉 결과는 [ 0 1 2 3 4 9 14 19 18 17 16 15 10 5 6 7 8 13 12 11] 가 되어야 한다.

풀이

먼저 행렬의 가장자리를 둘러서 [ 0 1 2 3 4 9 14 19 18 17 16 15 10 5]를 얻는 함수를 만든다.

위 그림을 보면 순서대로 가다가 마지막행[15 16 17 18 19]와 첫번째 열의[5 10 15]는 역순으로 출력이 되어야 한다.

def reverse(m) :
    return m[::-1]
    
def Border(m):
    reverse_last_row = reverse(m[-1])
    reverse_first_col = reverse(m[1:-1,0])
    return np.r_[m[0, :],m[1:-1,-1], reverse_last_row, reverse_first_col]

행렬이 아래 사진과 같이 n=1 혹은 m=1일 경우에 대해서도 가장자리의 값들을 얻을 수 있도록 코드를 수정한다.

def Border(m):
    A = []
    reverse_last_row = reverse(m[-1])
    reverse_first_col = reverse(m[1:-1,0])
    
    if (m[:, 0] == m[:, -1]).all(): #열이 하나일 때
        A = np.r_[m[0, :], m[1:-1,-1], m[-1]]
    elif len(m) == 1: #행이 하나일 때
        A = np.r_[m[0, :]]
    else :
        A = np.r_[m[0, :],m[1:-1,-1], reverse_last_row, reverse_first_col]
    return A

행렬의 가장자리를 두르고 남은 나머지 부분을 얻는 함수를 만든다.

def Inner(m):
    a = m[1:-1,1:-1]
    return a

최종 결과를 얻는 함수를 만든다.

def d_array(D):
    array = []
    while(1):
       # array = 이전 턴의 array + 이번 턴에 얻은 가장자리 값들로 이루어진리스트
        array = np.r_[array,Border(D)]
       # 행렬의 나머지 부분을 새로운 행렬로 대입
        D = Inner(D)
        if len(D) <= 1:
            break
    return array

첫번째 턴에서 array = [] + [0 1 2 3 4 9 14 19 18 17 16 15 10 5]가 되고 D = [6 7 8 13 12 11]이 된다.
이어지는 두번째 턴에서 array = [0 1 2 3 4 9 14 19 18 17 16 15 10 5] + [6 7 8 13 12 11]가 되고 D = []가 된다. len(D) = 0이므로 반복문을 탈출한다.

post-custom-banner

0개의 댓글