티스토리 뷰
행렬 곱셈 성공
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번째 괄호가 된다.
이 부분을 생각해서 식을 짜면 위처럼 나온다.
'프로그래밍 > 백준 문제풀이' 카테고리의 다른 글
백준 10090 counting inversions C/C++ (0) | 2022.12.16 |
---|---|
백준 1920 수 찾기 C/C++ (0) | 2022.12.06 |
백준 11404 폴로이드 C/C++ (0) | 2022.11.14 |
백준 11050 이항 계수 1 C/C++ (0) | 2022.11.12 |
백준24418 알고리즘 수업-행렬 경로 문제1 C/C++ (0) | 2022.11.11 |
- Total
- Today
- Yesterday
- 윤성우
- 보세사
- 티스토리챌린지
- 류근관
- 인프런
- 코딩테스트
- 정보처리기사
- stl
- 일문따
- 백준
- K-MOOC
- 파이썬
- C
- c++
- 오블완
- 일본어
- Python
- 데이터분석
- 통계
- 열혈프로그래밍
- 심리학
- 여인권
- 회계
- 통계학
- 강화학습
- C/C++
- 뇌와행동의기초
- 인지부조화
- 일본어문법무작정따라하기
- 사회심리학
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |