[Hackerrank] C++ - 39 Operator Overloading

후유카와·2024년 11월 22일

Hackerrank

목록 보기
38/59

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>를 갖는 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.

profile
안녕하세요! 저는 전자공학을 전공하며 하드웨어와 소프트웨어 모두를 깊이 있게 공부하고 있는 후유카와입니다. Verilog HDL, C/C++, Java, Python 등 다양한 프로그래밍 언어를 다루고 있으며, 최근에는 알고리즘에 대한 학습에 집중하고 있습니다. 기술적인 내용을 공유하고, 함께 성장할 수 있는 공간이 되기를 바랍니다. 잘못된 내용이나 피드백은 언제나 환영합니다! 함께 소통하며 더 나은 지식을 쌓아가요. 감사합니다!

0개의 댓글