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.
'프로그래밍 언어 > C, C++' 카테고리의 다른 글
[Hackerrank] 40. Overload Operators (0) | 2024.03.05 |
---|---|
[Hackerrank] 12. Attribute Parser (0) | 2024.03.01 |
[Hackerrank] 38. Preprocessor Solution (0) | 2024.03.01 |
[Hackerrank] 37. C++ Class Templates (0) | 2024.03.01 |
[Hackerrank] 36. Magic Spells (3) | 2024.02.29 |