[C#] 행렬의 곱셈

2020. 8. 12. 18:00[C#] 코딩테스트 문제풀이

반응형

프로그래머스 문제 (Level 2)

문제 설명

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

제한 조건

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

내 풀이

using System;

public class Solution {
        public int[,] solution(int[,] arr1, int[,] arr2)
        {
            int[,] answer = new int[arr1.GetLength(0),arr2.GetLength(1)];
            if(arr1.GetLength(1)==arr2.GetLength(0))//이문제에선 필요없지만 필수조건
            {
                for (int i=0;i<arr1.GetLength(0);i++)
                {
                    for (int j=0;j<arr1.GetLength(1);j++)
                    {
                        for (int k = 0; k < arr2.GetLength(1); k++)
                        {
                            answer[i, k] += arr1[i, j] * arr2[j, k];
                        }
                    }
                }
            }
            return answer;
        }
}

느낀점: 사실 대학 이산수학 시간에 배워, 행렬의 개념에 대해서 잘 알고 있었다. 하지만 코딩테스트에서 알고 있는 개념을 적용하는 것은

또 다른 문제였다.

우선 행렬의 곱이 성립되기 위해서는

첫번째 행렬의 열의 수와 두번째 행렬이 행의 수가 같아야 한다 - if(arr1.GetLength(1)==arr2.GetLength(0))

(이 문제에선 테스트 케이스를 위 조건에 맞는 수만 적어줘서 필요없는 if문이지만 정리하기 위해 적어둠)

 

조건을 만족했다면

1. 먼저 arr1의 모든 행을 기준으로 arr2의 모든 열에 대해서 회전해야 한다.

2. arr2의 1개 열을 처리할 때 해당 열의 모든 행을 회전해야 한다.

3. 2를 수행하면서 arr1과 arr2를 곱하고 더해간다.

 

반응형

'[C#] 코딩테스트 문제풀이' 카테고리의 다른 글

[C#]최솟값 만들기  (0) 2020.08.31
[C#]피보나치 수  (0) 2020.08.28
[C#] JadenCase 문자열 만들기  (0) 2020.08.12
[C#]N개의 최소 공배수  (2) 2020.08.11
[C#] 소수 만들기  (0) 2020.08.10