728x90
반응형
SMALL
프로그래머스 문제 풀이: 12949 행렬의 곱셈
문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/12949
문제 설명:
2차원 행렬 arr1과 arr2를 입력받아 arr1에 arr2를 곱한 결과를 반환하는 문제입니다. 행렬의 행과 열의 길이는 2 이상 100 이하이며, 원소는 -10 이상 20 이하의 정수입니다. 행렬 곱셈의 기본 원리를 이해하고 3중 반복문을 활용하여 구현해야 합니다.
문제 해결 코드
#include <string>
#include <vector>
using namespace std;
vector<vector<int>> solution(vector<vector<int>> arr1, vector<vector<int>> arr2) {
// 결과 행렬의 크기: arr1의 행 × arr2의 열
int rows = arr1.size(); // 첫 번째 행렬의 행 개수
int cols = arr2[0].size(); // 두 번째 행렬의 열 개수
int common = arr2.size(); // 공통 차원 (arr1의 열 = arr2의 행)
// 결과 행렬 초기화
vector<vector<int>> answer(rows, vector<int>(cols, 0));
// 행렬 곱셈 수행
for(int i = 0; i < rows; i++) {
for(int j = 0; j < cols; j++) {
// answer[i][j] = arr1의 i번째 행과 arr2의 j번째 열의 내적
for(int k = 0; k < common; k++) {
answer[i][j] += arr1[i][k] * arr2[k][j];
}
}
}
return answer;
}
코드 설명
- 핵심 알고리즘: 행렬 곱셈의 정의를 직접 구현한 방식입니다. A × B 행렬 곱셈에서 결과 행렬 C[i][j]는 A의 i번째 행과 B의 j번째 열의 내적(각 원소를 곱한 후 합산)으로 계산됩니다. m×n 크기의 행렬과 n×p 크기의 행렬을 곱하면 m×p 크기의 결과 행렬이 생성됩니다.
- 구현 세부사항:
- 결과 행렬의 크기를 arr1의 행 개수와 arr2의 열 개수로 결정하고 0으로 초기화합니다.
- 3중 반복문을 사용하여 결과 행렬의 각 위치 (i, j)에 대해 계산을 수행합니다.
- 가장 안쪽 반복문에서 arr1[i][k]와 arr2[k][j]를 곱한 값들을 누적하여 answer[i][j]를 완성합니다.
- 변수명을 rows, cols, common으로 명확하게 지정하여 가독성을 높였습니다.
- 시간/공간 복잡도: 시간 복잡도는 O(rows ⋅ cols ⋅ common)으로, 최악의 경우 O(100 ⋅ 100 ⋅ 100) = O(1,000,000) 연산이 필요하지만 충분히 효율적입니다. 공간 복잡도는 O(rows ⋅ cols)로 결과 행렬을 저장하는 공간이 필요합니다.
실행 예시
입력:
arr1 = [[1, 2], [3, 4]]
arr2 = [[5, 6], [7, 8]]
실행 과정:
- 결과 행렬 크기: 2×2
- answer[0][0] = 1×5 + 2×7 = 5 + 14 = 19
- answer[0][1] = 1×6 + 2×8 = 6 + 16 = 22
- answer[1][0] = 3×5 + 4×7 = 15 + 28 = 43
- answer[1][1] = 3×6 + 4×8 = 18 + 32 = 50
출력:
[[19, 22], [43, 50]]
결과
행렬 곱셈의 기본 원리를 3중 반복문으로 구현하여 모든 테스트 케이스를 통과했습니다. 행렬의 크기가 최대 100×100까지 주어지므로 O(n³) 복잡도로도 충분히 효율적으로 동작합니다.
다른 접근 방식이나 개선 사항이 있다면 댓글로 공유 부탁드립니다!
728x90
반응형
LIST
'programmers' 카테고리의 다른 글
| 프로그래머스 [연습문제 / 요격 시스템](C++) -yes6686- 티스토리 (0) | 2025.11.26 |
|---|---|
| 프로그래머스 [연습문제 / 실패율](C++) -yes6686- 티스토리 (0) | 2025.11.26 |
| 프로그래머스 [연습문제 / 모의고사](C++) -yes6686- 티스토리 (0) | 2025.11.26 |
| 프로그래머스 [연습문제 / 두 개 뽑아서 더하기](C++) -yes6686- 티스토리 (0) | 2025.11.26 |
| 프로그래머스 [연습문제 / 신고 결과 받기](C++) -yes6686- 티스토리 (0) | 2025.11.25 |