알고리즘/프로그래머스

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

Ynghan 2024. 4. 25. 21:59

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제

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

 

입출력

 

제한 사항

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

 

답 도출

가능하다면 나는 기본적으로 항상 문제를 가장 단순화하여 가장 쉬운 값들을 차례대로 대입해보면서 규칙성을 찾는 방식을 사용한다. 해당 문제도 기존에 행렬에 대한 기본적인 지식을 사용하여 값을 대입해보며 규칙성을 찾을 수 있었다.

위 필기는 arr1의 1행과 arr2의 1열에 대한 행렬 곱을 계산한 후 answer의 1행1열에 넣어주고,

arr1의 1행과 arr2의 2열에 대한 행렬 곱을 계산한 후 answer의 1행 2열에 넣어준 식을 나타낸 것이다.

식을 보면서 생각해 보았다... 식에서 arr1은 열이 1씩 증가하며 계산에 사용되고 있고, arr2은 행이 1씩 증가하며 계산에 사용되고 있다.....

answer의 열이 0일 때는 arr2의 열도 0이고, answer의 열이 1이면 arr2의 열도 1이다...

answer의 행이 0일 때는 arr1의 행도 1이네??

이런식으로 식을 보면서 생각해보다가 위에 기존에 알고 있던 행렬의 곱 성질을 적어놓은 것을 보고 answer의 행과 arr1의 행의 인덱스를 일치시킬 수 있고, answer의 열과 arr2의 열의 인덱스를 일치시킬 수 있다는 것을 알게 되었다.

이때, arr1과 arr2의 곱을 진행할 때, arr1의 열의 길이만큼의 횟수(j)만큼 덧셈이 진행되어야 하므로,

arr1의 행의 길이(i), arr1의 열의 길이(j), arr2의 열의 길이(k)가 모두 1씩 증가하면서 계산되므로 3중 for문으로 해결해보았다.

 

해결

def solution(arr1, arr2):
    
    answer = [[0 for i in range(len(arr2[0]))] for _ in range(len(arr1))]
    
    # answer과 arr1의 행을 일치시킨다.
    # arr1의 열은 0부터 arr1의 열의 길이만큼 순차적으로 증가한다.
    # arr2의 행의 길이는 arr1의 열의 길이와 동일하다.
    # 3중 for문으로 해결해보자.
    for i in range(len(arr1)):  # 일단 arr1의 행의 길이만큼 반복
        for j in range(len(arr1[0])):  # arr1의 열의 길이만큼 반복
            for k in range(len(arr2[0])):
                answer[i][k] += arr1[i][j] * arr2[j][k]

    return answer