24년 11월 이전/레거시-알고리즘(3)

[프로그래머스 1단계] 알고리즘 5. 행렬 합

Gurumee 2018. 2. 20. 23:48
반응형

문제 출처는 프로그래머스 알고리즘 연습 에서 볼 수 있습니다!(https://programmers.co.kr/learn/challenges)


알고리즘 5. 두 m x n 행렬의 합을 구하시오 (+ m x n , n x k 행렬의 곱 구하기)


#include<iostream>
#include<vector>
using namespace std;

vector<vector<int> > sumMatrix(vector<vector<int> >A, vector<vector<int> >B)
{
  vector<vector<int> > answer = A;
  
  return answer;
}
int main()
{
  vector<vector<int> > a{{1,2},{2,3}}, b{{3,4},{5,6}};
  vector<vector<int> > answer = sumMatrix(a,b);

  for(int i=0;i<answer.size();i++)
  {
    for(int j=0;j<answer[0].size();j++)
    {
      cout<<answer[i][j]<<" ";
    }
    cout<<"\n";
  }
}

풀이: 이건 뭐 쉽다.. 같은 행 같은 열의 행렬이면 같은 자리끼리 더하면 된다. 즉

answer[i][j] = A[i][j] + B[i][j]

이다. 따라서 코드는 다음과 같이 작성할 수 있다.(sumMatrix 부분만 작성하겠다.)

vector<vector<int> > sumMatrix(vector<vector<int> >A, vector<vector<int> >B)
{
  vector<vector<int> > answer = A;
  
for(int i=0; i<answer.size(); i++){
for(int j=0; j<answer[0].size(); j++){
answer[i][j] += B[i][j];
}
}
  return answer;
}

사실 너무 쉬워서 할 말이 없다.. 필자는 이걸 풀면서 1시간 정도 걸렸는데 그 이유는 처음에 문제를 행렬의 곱으로 봐서 그렇다. 그래서 푼게 아까워서 여기에 올려본다. 먼저 코드를 보고 풀이를 보는게 여러모로 잘 이해가 될 듯 싶다. 


vector<vector<int> > mulMatrix(vector<vector<int> > A, vector<vector<int> > B){
  vector<vector<int> > answer;

  for(int i=0; i<A.size(); i++){
    vector<int> tmp_col;
    for(int k=0; k<B[0].size(); k++){
      int sum=0;
      for(int j=0; j<A[0].size(); j++){ //A[0].size() == B.size()
          sum += (A[i][j] * B[j][k]);
      }
      tmp_col.push_back(sum)
    }
    answer.push_back(tmp_col);
  }
  return answer;
}


이거는 행렬 곱은 다음의 조건을 따른다. 


1. A 는 m x n, B 는 n x k 행렬일 때 가능하다. 

2. AB = m x k 행렬이 된다.


이것을 알고 있으면 문제 풀기는 편하다. 각 행의 열은 다음과 같다.


Answer[m][k] =  A[m][0,,n] x B[0..n][k] 의 합 


사실 이 문제는 A[0].size() == B.size() 를 먼저 묻는것이 타당하다. 그러나 어디까지나 문제이기 때문에 생략하였다. 배열의 경우 캐시 친화적인 코드를 작성하여 더 개선할 수 있으나 벡터가 가능한지는 모르겠다... 사실 행렬도 오래 걸리지 말았어야 했는데 아직 부족한게 많나보다.

728x90
반응형