[코딩테스트][프로그래머스] 행렬의 곱셈

김상욱·2024년 6월 24일

문제

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

JAVA 풀이

class Solution {
    public int[][] solution(int[][] arr1, int[][] arr2) {
        int[][] answer = new int[arr1.length][arr2[0].length];
        int n1=arr1.length;
        int m1=arr1[0].length;
        int n2=arr2.length;
        int m2=arr2[0].length;
        for(int i=0;i<n1;i++){
            for(int j=0;j<m2;j++){
                for(int k=0;k<m1;k++){
                    answer[i][j]+=arr1[i][k]*arr2[k][j];
                }
            }
        }
        return answer;
    }
}

내 생각

  • 행렬의 곱셈을 배운적이 없어서 찾아보는데 한참 걸렸다. 내가 이해한 행렬의 곱셈은 다음과 같다.

    행렬의 곱셈 : 각 행과 열을 나열된 순서대로 곱한 합을 다시 행렬의 형태로 나타낸다.

  • 즉, 코드로 나타낸다면 처음 오는 2차원 배열에서는 행을 두번째 오는 배열에서는 열을 하나씩 세며 곱하는데 처음 배열은 열방향으로 두번째 배열은 행방향으로 나아가며 곱하면 된다. 이 때, 더해주어야 하므로 2차원 배열을 하나 만들어둔후, 해당 행과 열에 해당되는 값에 더해지게 하면 된다.
  • 풀이시간 : 25분

Python 풀이

def solution(arr1, arr2):
    answer = [[0]*len(arr2[0]) for _ in range(len(arr1))]
    for i in range(len(arr1)):
        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

내 생각

  • 자바의 풀이와 전체적인 알고리즘 부분은 같다. 대신 코드의 길이를 조금 더 줄여보고자 len()으로 감싸서 길이를 처리하였고 처음 배열 부분도 0으로 크기를 미리 초기화 시켜놓았다.
  • 풀이시간 : 10분

0개의 댓글