코딩 테스트 연습/[프로그래머스] Python

[LV.2] 연습문제 > 행렬의 덧셈 ⭐

duswjd_data 2025. 6. 24. 14:34

문제

https://school.programmers.co.kr/learn/courses/30/lessons/12950

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr


문제 설명

  • 행렬의 덧셈
    • 행과 열의 크기가 같은 두 행렬(arr1, arr2)의 같은 행, 같은 열의 값을 서로 더한 결과
  •  제한 조건) 행렬 arr1, arr2의 행과 열의 길이는 500을 넘지 않음

최종 코드1

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

최종 코드2

def solution(arr1, arr2):
    return [[a + b for a, b in zip(row1, row2)] for row1, row2 in zip(arr1, arr2)]

첫 번째 시도 (실패. 오류)

def solution(arr1, arr2):
    return a+b for a, b in map(arr1, arr2)

오류난 이유

1. Python의 map() 함수반복 가능한 자료형(iterable)의 각 요소에 함수를 적용해서 새로운 값을 만들어주는 내장 함수

  • map() 함수 기본 구조
map(함수, iterable)
  • 함수: 각 요소에 적용할 함수
  • iterable: 리스트, 튜플 등 반복 가능한 자료형
  • 반환값: map 객체 (필요하면 list()로 감싸야 출력됨)
  • 예시) 두 리스트의 같은 위치끼리 더하기
a = [1, 2, 3]
b = [4, 5, 6]
result = map(lambda x, y: x + y, a, b)
print(list(result))  # [5, 7, 9]
  • map()은 여러 iterable을 병렬로 처리 가능
  • 주의할 점
    • map() 결과는 **map 객체**이므로 바로 출력하면 이상함
      → 꼭 list() 또는 for로 변환해야 확인 가능

2. return 다음에 리스트가 아닌 for 문이 그냥 나와 있는 문법 오류


접근 방법 (뭐지.. 너무 어렵다..😭)

<이중 for문 사용>

  1. 바깥 for문은 행을 돌게 하기
  2. 안쪽 for문은 열을 돌게 하기
  3. 각 행마다 새로운 리스트를 만들고, 열끼리 더한 값을 append 하기

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

 

코드 설명

  • answer = []
    • answer는 최종적으로 반환할 새 행렬(2차원 리스트)
    • 비어 있는 리스트에서 시작해서, 하나씩 row를 추가
  • for i in range(len(arr1)):
    • arr1의 행 수만큼 반복 (arr1과 arr2 길이 동일)
    • 예) arr1 = [[1,2],[2,3]]이면 len(arr1)은 2 → i는 0, 1
  • row = []
    • 현재 행에 해당하는 새로운 리스트
    • row에다가 열끼리 더한 값을 넣어줄 예정
  • for j in range(len(arr1[0])):
    • 열 단위 반복
    • arr1[0]은 첫 번째 행 → len(arr1[0])은 열의 개수
    • 예) [1, 2] → 열은 2개 → j는 0, 1
  • row.append(arr1[i][j] + arr2[i][j])
    • 두 행렬의 i행 j열 요소를 더해서 row에 추가
    • 예) arr1[0][1] + arr2[0][1] → 2 + 4 = 6
  • answer.append(row)
    • 한 줄(행)이 완성되면 그걸 answer에 추가
  • return answer
    • 최종적으로 완성된 answer 행렬을 반환

예시)  실행 흐름

최종 return) [[4,6], [7,9]]


<리스트 컴프리헨션 사용>

def solution(arr1, arr2):
    return [[a + b for a, b in zip(row1, row2)] for row1, row2 in zip(arr1, arr2)]

코드 설명 (밖 → 안 순서로 이해)

  • for row1, row2 in zip(arr1, arr2)
    • arr1과 arr2의 각 행(row)을 하나씩 짝지어 주기
    • 예:
      arr1 = [[1,2], [2,3]]
      arr2 = [[3,4], [5,6]]
      → zip하면:
      • row1 = [1,2], row2 = [3,4]
      • 그다음 row1 = [2,3], row2 = [5,6]
  • [a + b for a, b in zip(row1, row2)]
    • 각각의 행 row1과 row2를 zip하면, 열 단위로 요소를 묶을 수 있음
      • 예: zip([1,2], [3,4]) → (1,3), (2,4)
    • 그리고 각 쌍을 더해서 리스트로 만들어 주기: [4, 6]


*) 풀이 흐름 생각해보면서 많이 연습해보기!!! 할 수 있다!!!