Algorithm. 행렬의 대각 성분을 출력하는 방법

파이썬에서 행렬(Matrix) 데이터 타입을 다룰 때, 대각 성분을 출력하고자 하는 경우가 있습니다. NUMPY등의 라이브러리를 사용하면 손쉽게 대각 성분을 출력할 수 있지만, 본 포스팅에서는 각 인덱스에 접근하여 출력하는 방법을 소개하고자 합니다.

좌표 초기값이 지정되어 있지 않을 때

def get_matrix(n): # n * n 행렬을 생성
    m = []
    c = 0
    for i in range(n):
        temp = []
        for j in range(n):
            temp.append(c)
            c += 1
        m.append(temp)
    return m

m = get_matrix(5) # [[0, 1, 2, 3, 4], [5, 6, 7, 8, 9], [10, 11, 12, 13, 14], [15, 16, 17, 18, 19], [20, 21, 22, 23, 24]]
def get_diag(m):
    return [m[i][i] for i in range(len(m))]
    
def get_diag_reverse(m):
    return [m[idx][i] for idx, i in enumerate(range(len(m)-1, -1, -1))]

diag = get_diag(m)
diag # [0, 6, 12, 18, 24]

diag_rev = get_diag_reverse(m)
diag_rev # [4, 8, 12, 16, 20]

좌표 초기값이 지정되어 있을 때

def get_pos_diag(m, x, y):
    l = len(m)
    e = set()
    for i in range(l):
        if x+i < l and y+i < l:
            e.add(m[x+i][y+i])
        if x-i >= 0 and y-i >=0:
            e.add(m[x-i][y-i])
    return sorted(list(e))
    
def get_pos_diag_reverse(m, x, y):
    l = len(m)
    e = set()
    for i in range(l):
        if x+i < l and y-i >=0:
            e.add(m[x+i][y-i])
        if x-i >= 0 and y+i < l:
            e.add(m[x-i][y+i])
    return sorted(list(e))
    
pos_diag = get_pos_diag(m, 2, 3)
pos_diag # [1, 7, 13, 19]

pos_diag_rev = get_pos_diag_reverse(m, 2, 3)
pos_diag_rev # [9, 13, 17, 21]