[프로그래머스 Level2][Python] 행렬의 곱셈

토끼는 개발개발·2022년 1월 2일
1

Programmers

목록 보기
59/68
post-thumbnail

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

https://programmers.co.kr/learn/courses/30/lessons/12949

문제설명 📖

2차원 행렬 arr1과 arr2를 입력받아, arr1에 arr2를 곱한 결과를 반환하는 함수, solution을 완성해주세요.


제한사항

  • 행렬 arr1, arr2의 행과 열의 길이는 2 이상 100 이하입니다.
  • 행렬 arr1, arr2의 원소는 -10 이상 20 이하인 자연수입니다.
  • 곱할 수 있는 배열만 주어집니다.

입출력 예



문제접근 💡

  1. 행렬의 곱셈 개념이 필요하다.
  • AXB 행렬과 BXC 행렬을 곱하면 AXC행렬이 된다. (B가 같을 때만 곱할 수 있다.)
  • 행렬A에 행렬B를 곱하면 다음과 같다.
  1. answer = [([0]*x) for _ in range(y)]로 행렬 사이즈를 정해준다. x는 len(arr2[0]), y는 len(arr1)이다.
  2. 삼중for문을 사용해 곱하고, 더해준다.

문제풀이 💡

def solution(arr1, arr2):
    answer = [[0]*len(arr2[0]) for _ in range(len(arr1))]
    for i in range(len(arr1)): 
        lists = []
        for j in range(len(arr2[0])): 
            for k in range(len(arr1[0])): 
                answer[i][j] += arr1[i][k] * arr2[k][j]
    return answer

행렬 배열에 익숙하지 않아 헷갈렸다. 특히, 삼중for문 사용하면서 여러번 시행착오를 거쳐야 했다.
1) 7번 줄: arr1[i][k] arr2[j][k]값으로 적었음 -> 예제 2번 오류 -> arr1[i][k] arr2[k][j]로 수정
2) 5번 줄: len(arr2) 로 적었음 -> 예제는 통과했으나 테스트케이스 오류 ->len(arr2[0])으로 수정

+len(arr1)과 len(arr2[0]) 값을 변수에 저장하고 사용했으면 더 클린한 코드를 쓸 수 있을것 같다.



다른풀이 💡

def productMatrix(A, B):
    return [[sum(a*b for a, b in zip(A_row,B_col)) for B_col in zip(*B)] for A_row in A]

zip과 sum을 사용해 컴프리헨션으로 풀어낸 풀이...
이중 삼중 for문 컴프리헨션으로 짧은 줄로 써내는거 연습해야겠다.

profile
하이 이것은 나의 깨지고 부서지는 샏 스토리입니다

0개의 댓글