문제 설명
행렬의 덧셈은 행과 열의 크기가 같은 두 행렬의 같은 행, 같은 열의 값을 서로 더한 결과가 됩니다. 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])만큼 반복되는데, 이는 [[], [], ...] 형식의 행렬에서 안쪽 대괄호 안의 데이터 개수이므로 열의 개수이다.
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 |
알고리즘의 이해를 위해 한 페이지로 정리해보았다. 위 소스코드의 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 |