티스토리 뷰

반응형

행렬 곱셈 성공

 
시간 제한메모리 제한제출정답맞힌 사람정답 비율
1 초 128 MB 12923 8779 7623 69.388%

문제

N*M크기의 행렬 A와 M*K크기의 행렬 B가 주어졌을 때, 두 행렬을 곱하는 프로그램을 작성하시오.

입력

첫째 줄에 행렬 A의 크기 N 과 M이 주어진다. 둘째 줄부터 N개의 줄에 행렬 A의 원소 M개가 순서대로 주어진다. 그 다음 줄에는 행렬 B의 크기 M과 K가 주어진다. 이어서 M개의 줄에 행렬 B의 원소 K개가 차례대로 주어진다. N과 M, 그리고 K는 100보다 작거나 같고, 행렬의 원소는 절댓값이 100보다 작거나 같은 정수이다.

출력

첫째 줄부터 N개의 줄에 행렬 A와 B를 곱한 행렬을 출력한다. 행렬의 각 원소는 공백으로 구분한다.

예제 입력 1 복사

3 2
1 2
3 4
5 6
2 3
-1 -2 0
0 0 3

예제 출력 1 복사

-1 -2 6
-3 -6 12
-5 -10 18
#include <iostream>
using namespace std;




int main(void)
{
	int arr1[100][100];
	int arr2[100][100];
	int result[100][100]={0};

	int a1, a2, b1, b2;

	cin >> a1 >> a2;

	for (int i = 0; i < a1; i++)
		for (int j = 0; j < a2; j++)
			cin >> arr1[i][j];

	cin >> b1 >> b2;
	for (int i = 0; i < b1; i++)
		for (int j = 0; j < b2; j++)
			cin >> arr2[i][j];

	for(int k=0;k<a1;k++)
		for(int i=0;i<b2;i++)
			for (int j = 0; j < a2; j++)
			{
				result[k][i] += arr1[k][j] * arr2[j][i];
			}

	for (int i = 0; i < a1; i++)
	{
		for (int j = 0; j < b2; j++)
			printf("%d ", result[i][j]);
		printf("\n");
	}
	return 0;

}

 

남들은 쉽게푸는 것 같은데, 푸는데 꽤 고생했다.

 

어느 부분이 먼저 도는지를 먼저 캐치해야 하는데, 삼중 포문에서 맨 아래에 있는 곳이 어디인지를 잘 알아야한다.

 

\(\begin{pmatrix}
 a_{11}&a_{12}  \\
 a_{21}& a_{22} \\
 a_{31}&a_{32}   \\
\end{pmatrix}  \begin{pmatrix}
b_{11} & b_{12} & b_{13} \\
b_{21} & b_{22} & b_{23} \\
\end{pmatrix}\)

 

위의 두개의 행렬이 있다고 해보자.

그렇다면 제일 먼저 a11에서 왼쪽의 1은 고정돼있고, a11 * b11 + a12*b21 + a13*b31 이렇게 곱셈과 덧셈이 일어난다.

즉 맨 a11에서 맨 왼쪽1이 제일 마지막에 움직인다. 

뒤의 연산을 다 하고 아래행으로 넘어갈 때만 바뀐다. 그러니까 이것이 맨 첫번째 괄호가 된다.

그리고 제일 자주 바뀌는 것이 a11의 오른쪽1, b11의 왼쪽1이다. 이것은 수시로 바뀌기 때문에 이 부분에 가장 안쪽 괄호이다.

그리고 마지막으로 중간에 들어가는 것이 옆으로 열을 바꿀 때마다 바뀌니까 이것이 2번째 괄호가 된다.

 

이 부분을 생각해서 식을 짜면 위처럼 나온다.

반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함
반응형