조급하면 모래성이 될뿐

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

Algorithm/Programmers

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

Pawer0223 2020. 1. 7. 19:41

문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/12949

 

코딩테스트 연습 - 행렬의 곱셈 | 프로그래머스

[[2, 3, 2], [4, 2, 4], [3, 1, 4]] [[5, 4, 3], [2, 4, 1], [3, 1, 1]] [[22, 22, 11], [36, 28, 18], [29, 20, 14]]

programmers.co.kr

나의 풀이

- 선수지식 필수 ( 선형대수 )

* 행렬의 곱셈 공식에 대한 이해가 필요. ( 링크 : https://darkpgmr.tistory.com/103 )

 

- 두 행렬 A,B에 대해서 A*B 곱셈을 위해서는 A의 열과 B의 행이 같아야지만 가능하다.

 

- 먼저 문제의 예시를 보자.

 

arr1 -> [ [1,4], [3,2], [4,1] ]

arr2 -> [ [3,3] , [3,3] ]

 

해당 arr1,arr2는 3*2 , 2*3 행렬의 곱이므로 처리가능하다.

 

예시는 아래와같은 처리 순서로 처리된다.

 

- 행렬의 곱셈 방식에대해 이해했다면 위 처리 순서를 코드로 풀면 끝이다..

 

- 쉬워 보이지만, 오래 걸렸다...

 

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

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

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

코드

	private static int[][] solution(int[][] arr1, int[][] arr2) {

		// 행
		int row = arr1.length;
		// 열
		int col = arr2[0].length;

		int[][] answer = new int[row][col];
		
		// 2차행렬의 곱셈은 앞배열의 열, 뒤 배열의 행이 같아야 함.
		if(arr1[0].length == arr2.length ) {
			
			// a b c 
			for ( int i = 0 ; i < row; i++ ) {

				// i의 대상으로 arr2의 k열만큼 수행이 되야 함.
				for ( int k = 0 ; k < col; k ++ ) {

					// k열 수행 될때마다 처리되야하는 로직은 ?
					// 행 x 열 연산을 수행해주어야 한다.
					
					int value = 0;
					//arr1[i][0,1,2, ... ]
					for ( int j = 0 ; j < arr1[i].length; j++ ) {
						// * arr2[0,1,2][0]
						// arr1[i][j] * arr2[j][?]
						// j값은 동일하구만.
						value += arr1[i][j] * arr2[j][k];
						// answer 넣어주기.
					}
					answer[i][k] = value;
				}
			}
		}
		return answer;
	}

 

제출 결과

 

반응형