Coding Test/Programmers

[Lv.2] 행렬의 곱셈 [프로그래머스_코딩테스트] [2차원 배열, 구현] [25분]

whawoo 2025. 6. 30. 02:34
반응형

🔍 문제 요약

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

 

프로그래머스

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

programmers.co.kr

2차원 행렬 arr1과 arr2를 곱한 결괄르 반환하는 문제

🧠 나의 접근 방식과 시행착오

행렬의 곱셈에 대해서 어떻게 했는지 까먹었어서 시간이 오래 잡아먹은 문제.. 잘 기억해두자.. 풀어서 통과하긴 한 문제. 2차원 행렬이고 인덱스가 곱했을 때 어떻게 저장되는지 순간 헷갈려서 실수하기 좋은데 그림으로 잘 생각해보면 어렵지 않게 풀 수 있는 문제긴 하다.

/// <summary>
/// 행렬의 곱셈
/// https://school.programmers.co.kr/learn/courses/30/lessons/12949
/// </summary>
public int[,] solution(int[,] arr1, int[,] arr2)
{
    // 행렬의 곱셈은 arr1의 i행과 arr2의 i열을 곱한 합을 도출
    int[,] answer = new int[arr1.GetLength(0), arr2.GetLength(1)];

    for (int i = 0; i < arr1.GetLength(0); i++)
    {
        for (int k = 0; k < arr2.GetLength(1); k++)
        {
            for (int j = 0; j < arr2.GetLength(0); j++)
            {
                answer[i, k] += (arr1[i, j] * arr2[j, k]);
            }
        }
    }

    return answer;
}

✅ 풀이 코드

GetLength 계산이 for 안에서 하지 않고 밖으로 빼서 여러번 연산되는 것을 피하는 것 정도를 피드백으로 줬다.

public int[,] solution(int[,] arr1, int[,] arr2)
{
    int row1 = arr1.GetLength(0);
    int col1 = arr1.GetLength(1);
    int col2 = arr2.GetLength(1);

    int[,] answer = new int[row1, col2];

    for (int i = 0; i < row1; i++)
    {
        for (int k = 0; k < col2; k++)
        {
            int sum = 0;
            for (int j = 0; j < col1; j++)
            {
                sum += arr1[i, j] * arr2[j, k];
            }
            answer[i, k] = sum;
        }
    }

    return answer;
}

 

추가로 gpt가 준 팁으로는 C#에서는 Jagged Array라는 것이 있고 성능상 빠르다고 한다. (써본 적이 없는 기능이긴 해서 써보고 판단해야 할 듯 함)

2차원 행렬 곱셈 등 대규모 수치 계산시 Jagged Array와 Math.NET 과 같은 라이브러리 사용이 낫다 함
2차원 행렬 계산시 Jagged Array가 더 낫다고 하는 팁

🔄 정리

2차원 행렬의 곱에 대해서 까먹기 쉬운데 잘 생각해두자.

반응형