728x90
반응형
문제 설명
2차원 행렬 arr1과 arr2를 입력받아, arr1에 arr2를 곱한 결과를 반환하는 함수, solution을 완성해주세요.
제한 조건
- 행렬 arr1, arr2의 행과 열의 길이는 2 이상 100 이하입니다.
- 행렬 arr1, arr2의 원소는 -10 이상 20 이하인 자연수입니다.
- 곱할 수 있는 배열만 주어집니다.
입출력 예
arr1 | arr2 | return |
[[1, 4], [3, 2], [4, 1]] | [[3, 3], [3, 3]] | [[15, 15], [15, 15], [15, 15]] |
[[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]] |
문제 출처: 프로그래머스
문제 풀이
#include <string>
#include <vector>
using namespace std;
vector<vector<int>> solution(vector<vector<int>> arr1, vector<vector<int>> arr2)
{
vector<vector<int>> answer(arr1.size(), vector<int>(arr2[0].size(), 0));
//arr1.size() × arr2[0].size() 로 초기화 (행렬 곱셈시 이와 같은 사이즈로 결과가 나옴)
for(int i=0; i<arr1.size() ;i++) // arr1의 자리수로 늘어남
{
for(int j=0; j<arr2[0].size(); j++) // arr2의 행자리수로 늘어남
{
for(int k=0; k<arr2.size(); k++) // arr2의 열자리수로 늘어남
{
answer[i][j] += arr1[i][k] * arr2[k][j];
}
}
}
return answer;
}
처음에 아래와 같은 행렬 예시로 return 값을 구하는 식을 써보면
arr1 | arr2 | return |
[[1, 4], [3, 2], [4, 1]] | [[3, 3], [3, 3]] | [[15, 15], [15, 15], [15, 15]] |
arr1[0][0] X arr2[0][0] + arr1[0][1] X arr2[1][0] = answer[0][0]
arr1[0][0] X arr2[0][1] + arr1[0][1] X arr2[1][1] = answer[0][1]
arr1[1][0] X arr2[0][0] + arr1[1][1]X arr2[1][0] = answer[1][0]
arr1[1][0] X arr2[0][1] + arr1[1][1]X arr2[1][1] = answer[1][1]
arr1[2][0] X arr2[0][0] + arr1[2][1]X arr2[1][0] = answer[2][0]
arr1[2][0] X arr2[0][1] + arr1[2][1]X arr2[1][1] = answer[2][1]
...
위 코드와 같은 계산으로 진행된다. 따라서 특정 패턴을 반복하면서 answer 행렬이 완성된다.
이 패턴을 파악하고 반복문 3개로 이를 나타내면 된다.
이번 문제를 풀면서 머릿속으로 정리가 어려운 문제는 수식을 직접 적어서 정리하면 어떻게 코드를 짤지 틀이 보인다는 사실을 알았다.
추가로, 처음엔 answer을 아래와 같이 그대로 썼는데,
vector<vector<int>> answer;
이렇게 되면 에러가 발생한다. 따라서, answer의 크기를 지정해주고 초기화해주는 작업이 필요하다.
728x90
반응형
'프로그래머스 풀이' 카테고리의 다른 글
[c++]JadenCase 문자열 만들기 (0) | 2024.10.12 |
---|---|
오랜기간 보호한 동물(2) (0) | 2024.04.03 |
[javascript]타겟 넘버 (0) | 2024.03.13 |
[javascript]숫자의 표현 (0) | 2024.03.12 |
[javascript]음양 더하기 (1) | 2024.03.11 |