[프로그래머스 LV.2] 행렬의 곱셈 — Python 정답 & 해설

2026. 5. 22. 23:36·코딩테스트/알고리즘

🔗 1. 문제 URL

https://school.programmers.co.kr/learn/courses/30/lessons/12949?language=python3

 

프로그래머스

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

programmers.co.kr

 


 

📝 2. 문제 요구사항 정리

2차원 행렬 arr1과 arr2를 입력받아, 두 행렬을 곱한 결과를 반환하는 문제입니다. 선형대수학의 행렬 곱셈 연산 방식을 코드로 구현해야 합니다.

  • 행렬 곱셈 조건: 앞 행렬의 열 개수와 뒤 행렬의 행 개수가 같아야 연산이 가능합니다. (문제 조건상 항상 만족합니다.)
  • 결과 행렬의 크기: [arr1의 행(세로) 길이 × arr2의 열(가로) 길이] 크기의 새로운 행렬이 만들어집니다.

 


 

💡 3. 핵심 개념

✔ 1) 결과 행렬의 크기 예측 및 초기화

행렬 곱셈 결과의 크기는 row1 × col2가 됩니다. 연산 결과를 차곡차곡 더해나가기 위해 리스트 컴프리헨션을 사용하여 [[0] * col2 for i in range(row1)] 형태로 미리 0으로 채워진 빈 결과 행렬을 만들어두는 것이 정석입니다.

✔ 2) 3중 for문을 이용한 행렬 원소 연산

결과 행렬의 [i][j] 위치에 들어갈 값은 arr1의 $i$번째 행 원소들과 arr2의 $j$번째 열 원소들을 순서대로 곱해서 모두 더한 값입니다. 이를 위해 각각 행렬 1의 행(i), 행렬 2의 열(j), 그리고 연산이 겹치는 축(k)을 제어하는 3중 루프 구조가 필요합니다.

✔ 3) 행렬 인덱스 공식 수립

반복문 내부에서 누적 연산이 일어나는 핵심 공식은 다음과 같습니다:

answer[i][j] += arr1[i][k] * arr2[k][j]

arr1에서는 열 인덱스가 k로 움직이고, arr2에서는 행 인덱스가 k로 함께 움직이며 매칭됩니다.

 


 

✅ 4. 정답 Python 코드

def solution(arr1, arr2):
    # A * B 행렬 곱셈을 하면 결과 행렬의 크기는
    # [arr1의 세로 길이 * arr2의 가로 길이]
    
    row1, col1 = len(arr1), len(arr1[0])
    row2, col2 = len(arr2), len(arr2[0])
    
    # 결과 행렬 크기에 맞게 0으로 초기화
    answer = [[0] * col2 for i in range(row1)]
    
    # 3중 for문을 통한 행렬 곱셈 구현
    for i in range(row1):
        for j in range(col2):
            for k in range(col1): # col1 대신 row2를 넣어도 무방 (두 값은 같으므로)
                answer[i][j] += arr1[i][k] * arr2[k][j]
    
    return answer

 


 

💬 5. 풀이하면서 느낀 점

수학 책에서 손으로만 풀던 행렬의 곱셈 연산을 막상 2차원 컴퓨터 코드로 직접 구현하려고 하니 인덱스 구조를 짜는 과정에서 생각이 꽤 필요했던 문제였습니다.

문제를 해결하는 가장 큰 열쇠는 연산 결과로 도출될 새 행렬의 가로, 세로 크기를 정확히 정의하는 것과, 인덱스가 순환하는 공통 축의 범위를 올바르게 잡아내는 것이었습니다. 행렬의 arr1[i][k]와 arr2[k][j]에서 인덱스 k가 서로 맞물려 돌아가는 메커니즘을 시각적으로 정리해 볼 수 있어서 유익했습니다. 2차원 배열을 다루는 루프 제어를 동시에 점검해 볼 수 있었던 연습 문제였습니다.

 

궁금하신 점이나 포스팅에 대한 피드백이 있다면 댓글로 편하게 남겨주세요.

도움이 되셨다면 공감이나 댓글 한 줄 남겨주시면 포스팅을 이어가는 데 큰 힘이 됩니다. 😊

'코딩테스트 > 알고리즘' 카테고리의 다른 글

[프로그래머스 LV.0] 배열 만들기 2 — Python 정답 & 해설  (0) 2026.06.11
[프로그래머스 LV.0] 배열 조각하기 — Python 정답 & 해설  (0) 2026.06.11
[프로그래머스 LV.1] 모의고사 — Python 정답 & 해설  (0) 2026.05.21
[프로그래머스 LV.1] 두 개 뽑아서 더하기 — Python 정답 & 해설  (0) 2026.05.21
[프로그래머스 LV.2] 조건에 맞는 개발자 찾기 — MySQL 정답 & 해설  (0) 2025.11.27
'코딩테스트/알고리즘' 카테고리의 다른 글
  • [프로그래머스 LV.0] 배열 만들기 2 — Python 정답 & 해설
  • [프로그래머스 LV.0] 배열 조각하기 — Python 정답 & 해설
  • [프로그래머스 LV.1] 모의고사 — Python 정답 & 해설
  • [프로그래머스 LV.1] 두 개 뽑아서 더하기 — Python 정답 & 해설
작지만 꾸준한 성장으로
작지만 꾸준한 성장으로
contact
  • 작지만 꾸준한 성장으로
    파랑새
    작지만 꾸준한 성장으로
  • 전체
    오늘
    어제
    • 분류 전체보기 (26)
      • IT (3)
      • 코딩테스트 (23)
        • 알고리즘 (12)
        • MYSQL (11)
      • 패션 (0)
      • 독후감 (0)
      • TIL (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Pandas groupby agg
    와이드 포맷 롱 포맷
    프로그래머스 lv.2
    알고리즘
    python3
    프로그래머스 lv.0
    long format
    프로그래머스 lv.1
    Pandas pivot
    mysql
    데이터베이스
    코딩테스트
    SWEA
    코테
    I/O Bound
    Python
    파이썬코테
    CPU Bound
    Programmers
    wide format
    데이터 리모델링
    모델 추론
    sql 코딩테스트
    공공데이터 전처리
    데이터 전처리 파이프라인
    백준
    Pandas melt
    프로그래머스
    자바
    파이썬
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
작지만 꾸준한 성장으로
[프로그래머스 LV.2] 행렬의 곱셈 — Python 정답 & 해설
상단으로

티스토리툴바