37. C++ Class Templates
[ 난이도: Easy | 분야: Other Concepts ]
1. 내용 정리
클래스 탬플릿은 파라미터에 기반한 클래스를 생성하는 특징을 가지고 있다.
클래스 탬플릿은 컨테이너를 구현하는데 사용된다.
클래스 탬플릿은 탬플릿 인자로서 제공된 set을 인스턴스화한다.
아래의 MyTemplate 예시는 어느 타입이던 하나의 요소를 저장할 수 있고 주어진 값을 2로 나누는 divideBy2라는 함수를 하나 가지고 있다.
template <class T>
class MyTemplate {
T element;
public:
MyTemplate (T arg) {element=arg;}
T divideBy2 () {return element/2;}
};
특정 타입에 대한 탬플릿을 다르게 구현할 수 있고, 이를 Template Specialization이라고 한다.
위에서 주어진 template에서 우리는 char 형에서 정의된 Template이 더 유용함을 찾을수 있고, printElement라는 문자를 출력하는 함수를 정의하면:
// class template specialization:
template <>
class MyTemplate <char> {
char element;
public:
MyTemplate (char arg) {element=arg;}
char pritnElement ()
{
return element;
}
};
2. 과제
과제 설명
입력을 받는 main() 함수는 기본적으로 주어진다. 입력의 형식은 어떤 동작을 실행할 것인지 결정한다.
(예를 들어, 문자열을 자른 뒤 int나 float를 더한다.)
여기서 int나 float의 덧셈 연산을 하는 add() 함수를 갖는 AddElements라는 클래스 탬플릿을 작성하라.
또한 문자열 형식에 대해 template specialization를 수행하는 함수 concatenate()를 작성하고 두 번째 문자열과 첫 번째 문자열을 분리하라.
입력 형식
첫 번째 줄은 정수 n을 포함한다. 입력은 n + 1개의 줄로 이루어져 있고, 여기서 정수 n은 첫 번째 줄 뒤에 몇 개의 줄이 더 오는지를 나타낸다.
각 다음 n개의 줄은 요소의 데이터 형과 값들이 주어지고 이 값들은 주어진 데이터 형으로 정의된 값이다.
즉, 문자열이면 두 개의 문자열, 정수면 두 개의 정수, 소수면 두 개의 소수(float)가 주어진다.
자료형은 아직 정수, 소수 그리고 문자열 밖에 없다.
두 요소에 대해 잘라내거나 두 번째 요소를 첫 번째 요소에 더하라.
제약 사항
n은 1보다 크거나 같고 5 * 10^5보다 작거나 같다.
value_float는 1.0보다 크거나 같고 10.0보다 작거나 같다. 여기서 value_float는 float형의 값을 의미한다.
value_int는 1보다 크거나 같고 10^5보다 작거나 같다. 여기서 value_int는 int형 값을 의미한다.
len_string은 0보다 크거나 같고 10보다 작거나 같다. 여기서 len_string은 문자열의 길이를 의미한다.
이번 챌린지는 4초의 제한 시간을 가지고 있다.
출력 형식
코드 에디터에서 제공된 코드는 작성한 클래스 탬플릿을 사용하여 요소를 더하거나 추가하고 이 값들을 출력한다.
입력 예시
3
string John Doe
int 1 2
float 4.0 1.5
출력 예시
JohnDoe
3
5.5
설명
"Doe"를 "John"에 연결하면 "JohnDoe"가 되고 2를 1에 더하면 3, 1.5를 4.0에 더하면 5.5가 나온다.
문제
#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
#include <cassert>
using namespace std;
/*Write the class AddElements here*/
int main () {
int n,i;
cin >> n;
for(i=0;i<n;i++) {
string type;
cin >> type;
if(type=="float") {
double element1,element2;
cin >> element1 >> element2;
AddElements<double> myfloat (element1);
cout << myfloat.add(element2) << endl;
}
else if(type == "int") {
int element1, element2;
cin >> element1 >> element2;
AddElements<int> myint (element1);
cout << myint.add(element2) << endl;
}
else if(type == "string") {
string element1, element2;
cin >> element1 >> element2;
AddElements<string> mystring (element1);
cout << mystring.concatenate(element2) << endl;
}
}
return 0;
}
정답
#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
#include <cassert>
using namespace std;
/*Write the class AddElements here*/
template <class T>
class AddElements {
T element;
public:
AddElements<T> (T arg) {element = arg;}
T add(T element2) { return element + element2; }
string concatenate(string element2) {
element.append(element2);
return element;
}
};
int main () {
int n,i;
cin >> n;
for(i=0;i<n;i++) {
string type;
cin >> type;
if(type=="float") {
double element1,element2;
cin >> element1 >> element2;
AddElements<double> myfloat (element1);
cout << myfloat.add(element2) << endl;
}
else if(type == "int") {
int element1, element2;
cin >> element1 >> element2;
AddElements<int> myint (element1);
cout << myint.add(element2) << endl;
}
else if(type == "string") {
string element1, element2;
cin >> element1 >> element2;
AddElements<string> mystring (element1);
cout << mystring.concatenate(element2) << endl;
}
}
return 0;
}
©️Hackerrank. All Rights Reserved.
'프로그래밍 언어 > C, C++' 카테고리의 다른 글
[Hackerrank] 12. Attribute Parser (0) | 2024.03.01 |
---|---|
[Hackerrank] 38. Preprocessor Solution (0) | 2024.03.01 |
[Hackerrank] 36. Magic Spells (3) | 2024.02.29 |
[Hackerrank] 35. Accessing Inherited Functions (0) | 2024.02.27 |
[Hackerrank] 34. Messages Order (2) | 2024.02.27 |