알고리즘과 자료구조/[프로그래머스] LV.2

[프로그래머스] 행렬의 덧셈

Merware 2024. 8. 24. 15:49

문제 링크

문제 설명

행렬의 덧셈은 행과 열의 크기가 같은 두 행렬의 같은 행, 같은 열의 값을 서로 더한 결과가 됩니다. 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]]

나의 풀이

def solution(arr1, arr2):
    arr3 = []
    for i in range(len(arr1)):
        arr3.append(arr1[i] + arr2[i])
    return arr3

“실행한 결괏값 [[1,2,3,4],[2,3,5,6]]이 기댓값 [[4,6],[7,9]]과 다릅니다.”

라고 에러메시지가 뜬다. 내가 푼 풀이는 단순 배열 한 차원을 덧셈할 때 사용하는 것이고, 위 문제는 arr1과 arr2 배열 안에 배열이 있는 행렬이므로

  def solution(arr1, arr2):

    answer = []
    arr3 = []

    for i in range(len(arr1)):

        for j in range(len(arr1[i])):
            arr3.append(arr1[i][j] + arr2[i][j])
        answer.append(arr3)
    return answer

arr3 배열을 만들어서 i는 arr1의 길이를 범위로 j는 arr[i]일 때 i번째 값 즉, 배열을 순서대로 더하고 arr3에 더해주는 식으로 짜보았다. 그런데

“실행한 결괏값 [[4,6,7,9],[4,6,7,9]]이 기댓값 [[4,6],[7,9]]과 다릅니다.”

라는 에러가 떴는데 아마 arr3 = [] 를 i 반복문 안에 넣어야 하는데 루프를 돌지 않으니 생긴 문제인 것 같다.

def solution(arr1, arr2):

    answer = []

    for i in range(len(arr1)):
        arr3 = []
        for j in range(len(arr1[i])):
            arr3.append(arr1[i][j] + arr2[i][j])
        answer.append(arr3)
    return answer

이렇게 작성하니 에러가 뜨지 않는다.


가장 간결한 답

def sumMatrix(A,B):
    answer = [[c + d for c, d in zip(a,b)] for a, b in zip(A,B)]
    return answer

# 아래는 테스트로 출력해 보기 위한 코드입니다.
print(sumMatrix([[1,2], [2,3]], [[3,4],[5,6]]))
  1. zip 함수 사용:

    • zip(A, B)는 행렬 AB의 행을 한 쌍으로 묶어줍니다.
      • 예를 들어, A[[1, 2], [2, 3]]이고 B[[3, 4], [5, 6]]일 때, zip(A, B)([1, 2], [3, 4])([2, 3], [5, 6])를 반환합니다.
  2. 이중 리스트 컴프리헨션:

    • 바깥쪽 리스트 컴프리헨션에서 for a, b in zip(A, B)는 행렬 AB의 각각의 행을 순회합니다.
      • 첫 번째 순회: a = [1, 2], b = [3, 4]
      • 두 번째 순회: a = [2, 3], b = [5, 6]
    • 안쪽 리스트 컴프리헨션에서 for c, d in zip(a, b)는 각 행의 요소들을 순회하여 더해줍니다.
      • 첫 번째 순회에서 a = [1, 2]b = [3, 4]:
        • zip(a, b)[(1, 3), (2, 4)]를 반환합니다.
        • [c + d for c, d in zip(a, b)][1 + 3, 2 + 4]로 계산되어 [4, 6]을 반환합니다.
      • 두 번째 순회에서 a = [2, 3]b = [5, 6]:
        • zip(a, b)[(2, 5), (3, 6)]를 반환합니다.
        • [c + d for c, d in zip(a, b)][2 + 5, 3 + 6]로 계산되어 [7, 9]을 반환합니다.
  3. 결과 반환:

    • 바깥쪽 리스트 컴프리헨션이 [[4, 6], [7, 9]]를 반환합니다.

    • sumMatrix 함수는 최종적으로 [[4, 6], [7, 9]]를 반환합니다.

      내용이 워낙 헷갈리고 복잡해서 chat gpt로 정리한 내용을 올린다.