본문 바로가기

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

[Hackerrank] 37. C++ Class Templates

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.