Coding Test/HackerRank

[C++/Classes] Box it!

깐요 2022. 1. 9. 16:16

문제


Box It! | HackerRank

 

Box It! | HackerRank

Design a class named Box with overloaded operators.

www.hackerrank.com

육면체의 길이, 너비, 높이 값을 관리하고, 부피를 구하는 Box 클래스를 구현하는 문제입니다.
또한, 연산자 오버로드를 통해 클래스에 맞는 연산 결과를 출력하는 문제입니다.

풀이

 


조건에 맞는 클래스(Class)를 구현하고, 오버로드(Overloading)를 활용할 수 있는지에 관해 물어보는 문제입니다.

        Box() { l = 0; b = 0; h = 0; }
        Box(int length, int breadth, int height) {
            l = length; b = breadth; h = height;
        }
        Box(Box& B) { l = B.l; b = B.b; h = B.h; }

'Box' Class의 생성자를 구현한 모습입니다.

생성자(Constructor, ctor)란 객체의 초기화를 담당하는 서브루틴을 말하며, 객체가 처음 생성될 때 호출됩니다.

총 3개의 생성자를 구현했습니다.

매개변수(Parameter)가 없는 생성자와 3개의 정수 매개변수를 갖는 생성자, Box 클래스를 참조하는 매개변수를 갖는 생성자가 있습니다.

생성자 오버로드(Function overloading)는 같은 생성자 이름을 가지고 있으나 매개변수가 다른 여러 개의 생성자를 선언할 수 있게 합니다.

단, 과도한 오버로드의 설계는 코드 분석을 어렵게 하므로 주석을 통해 설명을 확실히 해두어야 합니다.

        long long CalculateVolume() {
            long long result;
            result = (long long)l * b * h;  //data type cast

            return result;
        }

Box의 부피를 계산하는 연산문입니다.

문제는 long long 타입으로 값을 반환하는 함수를 사용하기를 지시했습니다.

여기서 주의해야 할 점은 피연산자들이 int 타입으로 선언됐고, 값을 입력했다는 것입니다.

만약 연산문에서 명시적으로 데이터 타입을 변환해주지 않는다면, 연산 결과는 int 타입으로 반환되고, 오버플로우(Overflow)가 발생한 값이 'result'에 삽입됩니다.

따라서, long long 타입으로 명시적으로 변환하여 연산 결과도 long long 타입으로 반환되도록 했습니다.

        //Overload
        bool operator<(Box& B) {
            if (l < B.l) { return true; }
            else if (l == B.l && b < B.b) { return true; }
            else if (l == B.l && b == B.b && h < B.h) { return true; }
            else { return false; }
        }
        friend ostream& operator<<(ostream& os, Box& B) {
            os << B.l << " " << B.b << " " << B.h;
            return os;
        }

연산자 오버로딩을 다루는 모습입니다.

연산자 오버로딩(Operator overloading)은 기존 연산을 재정의 하여 사용자 정의 함수로 구현하여 사용합니다.

아래에서 오버로딩한 연산자 '<'의 경우 피연산자로 'Box' 클래스를 사용할 수 없지만, 오버로딩을 거쳐서 연산이 가능하도록 만들었습니다.

함수 오버로딩처럼 매개변수와 반환하는 값도 바꿔줄 수 있습니다.

'Box' 클래스의 속성 값들을 출력하기 위해 '<<' 삽입 연산자를 오버로딩했습니다.

'<<' 연산자 오버로딩는 ostream 클래스의 멤버 함수이고, ostream 클래스는 C++ 표준입니다.

C++ 표준은 사용자가 재정의할 수 없으므로 전역 함수로 구현해야 합니다.

따라서, ostream 클래스를 friend로 지정하여 접근 권한을 갖고, 'cout'을 전달 받기 위한 ostream 타입 객체와 'Box' 타입의 객체를 참조 받는 함수로 오버로딩을 구현합니다.

반환 값의 타입이 ostream 객체인 이유는 삽입 연산자를 연속적으로 사용하는 경우가 있기 때문입니다.

 

 

전체 코드


#include<bits/stdc++.h>

using namespace std;

//Implement the class Box  
//l,b,h are integers representing the dimensions of the box

// The class should have the following functions : 

// Constructors: 
// Box();
// Box(int,int,int);
// Box(Box);


// int getLength(); // Return box's length
// int getBreadth (); // Return box's breadth
// int getHeight ();  //Return box's height
// long long CalculateVolume(); // Return the volume of the box

//Overload operator < as specified
//bool operator<(Box& b)

//Overload operator << as specified
//ostream& operator<<(ostream& out, Box& B)

class Box {
    private:
        int l, b, h;
    public:
        Box() { l = 0; b = 0; h = 0; }
        Box(int length, int breadth, int height) {
            l = length; b = breadth; h = height;
        }
        Box(Box& B) { l = B.l; b = B.b; h = B.h; }

        int getLength() { return l; }
        int getBreadth() { return b; }
        int getHeight() { return h; }

        long long CalculateVolume() {
            long long result;
            result = (long long)l * b * h;  //data type cast

            return result;
        }

        //Overload
        bool operator<(Box& B) {
            if (l < B.l) { return true; }
            else if (l == B.l && b < B.b) { return true; }
            else if (l == B.l && b == B.b && h < B.h) { return true; }
            else { return false; }
        }
        friend ostream& operator<<(ostream& os, Box& B) {
            os << B.l << " " << B.b << " " << B.h;
            return os;
        }
};

void check2() ...

 

 

참고


[고유 클래스에 대해 << 연산자 오버로드 | Microsoft Docs]

 

사용자 고유의 < 클래스에 대한< 연산자 오버로드

자세한 정보: < 사용자 고유의 클래스에 대한< 연산자 오버로드

docs.microsoft.com

[<iostream> | Microsoft Docs]

 

<iostream>

자세한 정보:

docs.microsoft.com

 

320x100

'Coding Test > HackerRank' 카테고리의 다른 글

[C++/STL] Deque-STL  (0) 2022.01.16
[C++/Class] Abstract Classes - Polymorphism  (0) 2022.01.15
[C++/Classes] Virtual Functions  (0) 2022.01.15
[C++/Classes] Exceptional Server  (0) 2022.01.15
[C++/Classes] Inherited Code  (0) 2022.01.09