✔️ 행렬의 덧셈 연산을 수행하는 함수를 만들어보자!

✏️ 함께 풀어보면 좋은 코딩테스트 문제: BOJ 2738

Solution 1) numpy 이용

  • numpyarray를 사용하여 행렬을 생성하고, 두 행렬의 크기를 비교한 후 덧셈 수행
  • 마지막에 결과를 다시 Python의 list로 변환하여 반환
import numpy as np

def add_matrices(matrix1, matrix2):
    np_matrix1 = np.array(matrix1)
    np_matrix2 = np.array(matrix2)

    if np_matrix1.shape != np_matrix2.shape:
        raise ValueError("Matrix dimensions do not match.")

    result = np_matrix1 + np_matrix2
    return result.tolist()  # Convert NumPy array back to a Python list
# Example usage:
matrix1 = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
matrix2 = [[9, 8, 7], [6, 5, 4], [3, 2, 1]]

result_matrix = add_matrices(matrix1, matrix2)
print(result_matrix)
--------------------------------------------------
[[10, 10, 10], [10, 10, 10], [10, 10, 10]]


Solution 2) 이중 for문

  • Loop(이중 for문)을 이용하여 행렬 덧셈 수행
  • 행렬의 크기 확인 후, 각 원소를 더한 후에 결과 list에 추가
  • 장단점
    • 명시적인 이중 loop 구조로, 가독성이나 유지보수 측면에서 코드의 동작이 명확하게 드러난다
    • 큰 행렬에서 메모리 사용량이 작을 수 있다
    • Loop를 사용하므로 성능 면에서 list comprehension에 비해 느릴 수 있다
def add_matrices(matrix1, matrix2):
    if len(matrix1) != len(matrix2) or len(matrix1[0]) != len(matrix2[0]):
        raise ValueError("Matrix dimensions do not match.")

    result = []
    for i in range(len(matrix1)):
        row = []
        for j in range(len(matrix1[0])):
            row.append(matrix1[i][j] + matrix2[i][j])
        result.append(row)
    return result
# Example usage:
matrix3 = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
matrix4 = [[9, 8, 7], [6, 5, 4], [3, 2, 1]]

result_matrix = add_matrices(matrix3, matrix4)
print(result_matrix)
--------------------------------------------------
[[10, 10, 10], [10, 10, 10], [10, 10, 10]]


Solution 3) List Comprehension + zip 함수 이용

  • List comprehension을 이용하게 간단하게 작성
  • zip 함수를 이용하여 두 행렬의 각 행의 원소를 묶어서 덧셈 수행하고, 그 결과를 새로운 list로 만든다
  • 장단점
    • 간결하고 짧은 코드
    • 큰 행렬에서는 list comprehension을 사용할 경우 메모리 사용량이 증가할 수 있다
    • 오류 발생시 어디서 오류가 발생했는지 정보가 부족하다. 즉, 디버깅이 어려울 수 있다
def add_matrices(matrix1, matrix2):
    if len(matrix1) != len(matrix2) or len(matrix1[0]) != len(matrix2[0]):
        raise ValueError("Matrix dimensions do not match.")

    result = [[c + d for c, d in zip(a, b)] for a, b in zip(matrix1, matrix2)]
    return result
# Example usage:
matrix5 = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
matrix6 = [[9, 8, 7], [6, 5, 4], [3, 2, 1]]

result_matrix = add_matrices(matrix5, matrix6)
print(result_matrix)
--------------------------------------------------
[[10, 10, 10], [10, 10, 10], [10, 10, 10]]

💡 “Loop를 사용하거나 list comprehension을 사용하는 경우에 따라 큰 행렬에서 메모리 사용량이 달라질 수 있다??”

  • List comprehension보다 Loop를 사용하여 각 원소를 하나씩 처리하는 방식이 메모리를 덜 사용할 수 있다는 것을 의미

  • Loop를 사용하면 각 원소를 순회하면서 하나씩 연산하고 결과를 저장하기 때문에, 큰 행렬에서도 한 번에 많은 양의 메모리를 사용하지 않는다. 대신에 각 행의 결과를 하나씩 만들어가면서 최종 결과를 얻는다

  • List comprehension을 사용하여 한 번에 모든 연산을 처리하면, 큰 행렬의 경우 그 크기에 비례하여 많은 메모리를 사용할 수 있다. 이는 모든 결과를 한 번에 생성하여 list에 저장하게 되기 때문

  • 결론: 주로 Python의 list comprehension과 같이 한 번에 모든 원소를 처리하는 방식이 큰 데이터셋에서 메모리 사용량이 더 많아질 수 있다는 일반적인 원리! ⭐️

Leave a comment