본문 바로가기

프로그래밍 언어/C, C++

[Hackerrank] 39. Operator Overloading

39. Operator Overloading

1. 내용 정리

클래스는 C++에서 새로운 타입을 정의한다. C++에서의 타입은 constructions와 assignments와 호환되는 것이 아닌 연산자에서도 가능하다. 예를 들어:

int a=2, b=1, c;
c = b+a;

 

c의 값은 3일 것이다.

비슷하게, 클래스에서 또한 연산자 오버로딩을 통해 연산 기능을 수행할 수 있다.

연산자는 특별한 이름의 정규 함수인 연산자 함수에 의해 오버로드 된다.

이들 이름은 오버로딩된 연산자 기호를 따라 연산자 키워드로 시작된다. 양식은 다음과 같다:

type operator sign (parameters) { /*... body ...*/ }

 

2. 과제

main() 함수에는 두 개의 행렬를 만드는 입력이 있고 이들의 합을 출력한다. 멤버의 타입으로 vector<vector<int>>를 갖는 Matrix 클래스를 작성하라. 또한 연산자 +를 오버로드 하기 위한 멤버 함수를 작성하라.이 함수는 두 행렬의 합을 결과로서 반환한다.

입력 형식

첫 번째 줄은 테스트 케이스의 개수인 T를 포함한다. 각 테스트 케이스 별로, 세 줄의 입력이 있다.

각 테스트 케이스의 첫 번째 줄은 정수 N과 M을 가지고 있고 각각 행의 개수와 열의 개수를 의미한다.

두 번째 행렬에 대한 것은 다음 두 줄에 나온다.

이 다음 두 줄은 각각 N * M개의 요소들을 가지고 있고 각각 row-wise format으로 들어가 있다.

첫 번째 M개의 요소들은 첫 번째 줄을 다음 M개의 요소들은 두 번째 줄 등등으로 들어가 있다.

 

제약 사항

T는 1보다 크거나 같고 1000보다 작거나 같다.

N은 1보다 크거나 같고 100보다 작거나 같다.

M은 1보다 크거나 같고 100보다 크거나 같다.

A_i,j는 1보다 크거나 같고 10보다 작거나 같다. (A_i,j는 i번째 행, j번째 열에 해당하는 요소다.)

 

출력 형식

에디터에서 제공하는 코드는 당신이 작성한 Matrix 클래스를 사용하고 overloaded operator function을 두 행렬을 합하는데 사용한 후 이 결과를 출력한다.

 

입력 예시

1
2 2
2 2 2 2
1 2 3 4

 

출력 예시

3 4
5 6

 

설명

첫 번째 행렬과 두 번째 행렬의 합을 출력한 것이다.

 

문제

#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;

int main () {
   int cases,k;
   cin >> cases;
   for(k=0;k<cases;k++) {
      Matrix x;
      Matrix y;
      Matrix result;
      int n,m,i,j;
      cin >> n >> m;
      for(i=0;i<n;i++) {
         vector<int> b;
         int num;
         for(j=0;j<m;j++) {
            cin >> num;
            b.push_back(num);
         }
         x.a.push_back(b);
      }
      for(i=0;i<n;i++) {
         vector<int> b;
         int num;
         for(j=0;j<m;j++) {
            cin >> num;
            b.push_back(num);
         }
         y.a.push_back(b);
      }
      result = x+y;
      for(i=0;i<n;i++) {
         for(j=0;j<m;j++) {
            cout << result.a[i][j] << " ";
         }
         cout << endl;
      }
   }  
   return 0;
}
더보기

정답

#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;

class Matrix {
    public:
        vector<vector<int>> a;
        Matrix operator+(Matrix myMatrix){
            int rows = a.size();
            int cols = a[0].size();
            for(int i = 0; i < rows; i++) {
                for(int j = 0; j < cols; j++) {
                    myMatrix.a[i][j] += a[i][j];
                }
            }
            return myMatrix;
        }
};

int main () {
   int cases,k;
   cin >> cases;
   for(k=0;k<cases;k++) {
      Matrix x;
      Matrix y;
      Matrix result;
      int n,m,i,j;
      cin >> n >> m;
      for(i=0;i<n;i++) {
         vector<int> b;
         int num;
         for(j=0;j<m;j++) {
            cin >> num;
            b.push_back(num);
         }
         x.a.push_back(b);
      }
      for(i=0;i<n;i++) {
         vector<int> b;
         int num;
         for(j=0;j<m;j++) {
            cin >> num;
            b.push_back(num);
         }
         y.a.push_back(b);
      }
      result = x+y;
      for(i=0;i<n;i++) {
         for(j=0;j<m;j++) {
            cout << result.a[i][j] << " ";
         }
         cout << endl;
      }
   }  
   return 0;
}

 

 

 

 

 

©️Hackerrank. All Rights Reserved.