2026. 1. 8. 00:44ㆍPS (Program Solving)/BOJ (백준)
문제 설명
https://www.acmicpc.net/problem/2740

접근 방법 - 배열을 활용한 연산 응용문제
백준의 2740번 문제는 배열을 활용하면서 연산을 수행하여 해결해야 하는 문제이다.
해당 문제는, 입력으로 주어지는 두 행렬에 대하여 곱 연산을 수행하였을 때 나타나는 결괏값을 구하여 출력해야 하는 문제이다.
이때, 행렬 곱에 대한 공식을 사전에 알고 있어야 해당 문제를 해결할 수 있다는 점을 꼭 감안하여야 한다.
사실 필자도 행렬 연산은 생소해서(...) 연산 공식을 찾아가면서 문제 해결을 시도해 보았다.
행렬 곱셈 결과의 각 요소값은 모두 아래와 같은 방식으로 연산이 이루어지니, 처음 접해보는 경우에는 꼭 참고해 보길 바란다.
(이때 행렬 곱셈은, A 행렬의 열 개수(가로)와 B 행렬의 행 개수(세로)가 서로 동일해야 한다는 전제가 깔려있다.)

위 그림을 통하여, A 행렬(m*n)과 B 행렬(n*p)의 곱 결과인 C 행렬은 m*p의 크기를 가진다는 점도 함께 참고하면 도움이 될 것이다.
결과적으로, A[i][k]*B[k][j]의 총합이 C[i][j]의 값이 된다는 점을 알 수 있다.
보다 자세한 설명은 아래에 기재해 놓으니, 혹여나 해당 문제를 해결하는 데에 어려움을 겪고 있다면 아래의 설명과 코드를 참고해 보길 바란다.
필자는 아래의 순서대로 코드를 작성하여 문제를 해결하였다.
코드의 실행 순서
1) 연산을 수행할 첫 번째 행렬 정보(행 크기, 열 크기, 각 요소값)를 순차적으로 입력받는다. 설명에서는 A라 지칭하겠다.
2) 연산을 수행할 두 번째 행렬 정보(행 크기, 열 크기, 각 요소값)를 순차적으로 입력받는다. 설명에서는 B라 지칭하겠다.
3) 2중 반복문을 활용하여, 아래의 연산을 취한다.
(i는 A와 행렬곱 결과의 행을 지칭하며, j는 B와 행렬곱 결과의 열을 지칭하게끔 하였다.)
- 행렬곱 결과에 있어, 현재 위치의 요소값을 연산할 변수 sum을 0으로 초기화하여 선언해 둔다.
- 다른 반복문을 통하여, 행렬곱 연산을 진행하도록 한다.
k라는 제어 변수를 만들고 이를 변동시켜 가며, A[i][k]*B[k][j]를 하나씩 구하고 이 값을 sum에 순차적으로 더하도록 한다.
- 현재 위치의 요소값인 sum값 연산이 모두 종료되었다면, 현재 위치에 대한 요소값을 즉시 출력하도록 한다.
다음 요소값과 구분이 가도록, 결괏값 다음으로는 " "(공백)을 출력한다.
- 행렬곱 결과의 한 행에 대해 출력이 모두 완료될 때마다, 다음 행 출력을 위하여 줄 바꿈을 수행한다.
그 이후로는, 그다음 행에 대한 행렬곱 연산을 마저 이어하도록 한다.
4) 3)에 대한 연산이 모두 완료되었다면, 정답 또한 모두 출력이 되었다고 볼 수 있기 때문에 실행을 종료하도록 한다.
성공한 코드
#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable: 4996)
#include <iostream>
#define endl '\n'
using namespace std;
//백준 2740번 코드
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
int n1, m1, a[101][101];
cin >> n1 >> m1;
for (int i = 0; i < n1; i++) {
for (int j = 0; j < m1; j++) {
cin >> a[i][j];
}
}
int n2, m2, b[101][101];
cin >> n2 >> m2;
for (int i = 0; i < n2; i++) {
for (int j = 0; j < m2; j++) {
cin >> b[i][j];
}
}
for (int i = 0; i < n1; i++) {
for (int j = 0; j < m2; j++) {
int sum = 0;
for (int k = 0; k < m1; k++) {
sum += a[i][k] * b[k][j];
}
cout << sum << " ";
}
cout << endl;
}
}
제출 결과

(2024.05.26 백준 2740번 문제 제출 결과)
최선으로 적어보려 하였지만 어딘가 미흡한 듯하다ㅠ
'PS (Program Solving) > BOJ (백준)' 카테고리의 다른 글
| [백준 BOJ] 31656번 Sticky Keys (C++/cpp) (0) | 2026.01.08 |
|---|---|
| [백준 BOJ] 30664번 Loteria Falha (Python) (0) | 2026.01.08 |
| [백준 BOJ] 11497번 통나무 건너뛰기 (C++/cpp) (0) | 2026.01.04 |
| [백준 BOJ] 2965번 캥거루 세마리 (C++/cpp) (0) | 2025.12.29 |
| [백준 BOJ] 2372번 Livestock Count (Ada) (0) | 2025.12.22 |