Python 공부기록

Python _ 행렬의 덧셈

혜원89 2021. 2. 26. 19:48

문제 설명

행렬의 덧셈은 행과 열의 크기가 같은 두 행렬의 같은 행, 같은 열의 값을 서로 더한 결과가 됩니다. 2개의 행렬 arr1과 arr2를 입력받아, 행렬 덧셈의 결과를 반환하는 함수, solution을 완성해주세요.

제한 조건

  • 행렬 arr1, arr2의 행과 열의 길이는 500을 넘지 않습니다.

입출력 예

arr1 arr2 return
[[1,2],[2,3]] [[3,4],[5,6]] [[4,6],[7,9]]
[[1],[2]] [[3],[4]] [[4],[6]]

✅SOL_1

1
2
3
4
5
6
def solution(arr1, arr2):
    for i in range(len(arr1)):
        for j in range(len(arr1[0])):
            arr1[i][j]+=arr2[i][j]
 
    return arr1
cs

 

이중 for문으로 행렬의 행과 열에 접근한다. 먼저 변수 i는 리스트 arr1의 길이만큼 반복문에 적용된다. 이때 len(arr1)은 행렬이 [[]]형식 일 때 바깥 대괄호에서 적용되는 길이라고 생각하면 된다. [[], [], ...]로 된 행렬은 리스트의 데이터로 리스트를 포함하고 있는 것으로 arr1의 길이라고 하면 안쪽 대괄호의 개수 즉 행의 개수라고 할 수 있다. 두 번째 for문 변수 j는 len(arr1[0])만큼 반복되는데, 이는 [[], [], ...] 형식의 행렬에서 안쪽 대괄호 안의 데이터 개수이므로 열의 개수이다.

 

파이썬 행렬의 덧셈 - 이중for문 알고리즘

 

2차원 리스트를 이용한 행렬이 개인적으로 어려워서 차근차근 적어가며 이해했다.

for문 안에 arr1 행렬과 arr2 행렬의 합을 arr1에 덮어 저장하였기 때문에 arr1을 return 한다.  

 

✅SOL_2

1
2
def solution(arr1,arr2):
    return [[c + d for c, d in zip(a, b)] for a, b in zip(arr1, arr2)]
cs

 

파이썬 행렬의 덧셈 - 내장함수 zip을 사용한 알고리즘

 

알고리즘의 이해를 위해 한 페이지로 정리해보았다. 위 소스코드의 return문에 작성한 형식은 리스트를 정의할 때 사용하는 문법이다.

lst_matrix = [[0 for col in range[10]] for row i range[10]]

위와 같이 2차원 리스트로 10X10 행렬의 선언할 수 있다.

 

문제의 소스코드에서는 zip(arr1, arr2) (손글씨 정리노트에는 A, B로 하였다) 에  대한 변수 a, b를 행의 값으로 선언하고 zip(a, b)에 대한 변수 c, d의 합 c+d를 열의 값으로 선언하였다. 문제의 1번 예로 설명을 해보자면, zip(arr1, arr2) = [([1, 2], [3, 4]), ([2, 3], [5, 6])] = [(a0, b0), (a1, b1)] 이다. 이때 변수 a, b, c, d 뒤의 숫자는 순서를 위한 표현이다. 

먼저 a0, b0에 대해 zip(a0, b0) = [(1, 3), (2, 4)] = [(c0, d0), (c1, d1)]이므로 return 되는 리스트의 [0][0] = c0+d0 = 1+3, [0][1] = c1+d1 = 2+4이다.

마찬가지로 a1, b1에 대해 zip(a1, b1) = [(2, 5), (3, 6)] = [(c2, d2), (c3, d3)]이므로 return되는 리스트의 [1][0] = c2+d2 = 2+5, [1][1] = c3+d3 = 3+6이다. 출력되는 return의 리스트는 arr1, arr2 두 행렬의 합이 된다. 

'Python 공부기록' 카테고리의 다른 글

Python _ 콜라츠 추측  (9) 2021.03.03
Python _ 평균구하기  (0) 2021.03.02
Python _ 핸드폰 번호 가리기  (0) 2021.02.25
Python _ x만큼 간격이 있는 n개의 숫자  (0) 2021.02.24
Python3 _ 직사각형 별찍기  (0) 2021.02.23