본문 바로가기

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

[Hackerrank] 35. Accessing Inherited Functions

35. Accessing Inherited Functions

[ 난이도: Medium | 분야: Inheritance]

1. 과제

문제에서 클래스 A, B 그리고 C가 주어진다. 모든 세 클래스는 그들만의 함수를 가지고 있다.

클래스 A에는 받아온 파라미터에 2를 곱한다.

class A
{
    public:
        A(){
            callA = 0;
        }
    private:
        int callA;
        void inc(){
            callA++;
        }

    protected:
        void func(int & a)
        {
            a = a * 2;
            inc();
        }
    public:
        int getA(){
            return callA;
        }
};

클래스 B에는 받아온 파라미터에 3을 곱한다.

class B
{
    public:
        B(){
            callB = 0;
        }
    private:
        int callB;
        void inc(){
            callB++;
        }
    protected:
        void func(int & a)
        {
            a = a * 3;
            inc();
        }
    public:
        int getB(){
            return callB;
        }
};

클래스 C에는 받아온 파라미터에 5를 곱한다.

class C
{
    public:
        C(){
            callC = 0;
        }
    private:
        int callC;
        void inc(){
            callC++;
        }
    protected:
        void func(int & a)
        {
            a = a * 5;
            inc();
        }
    public:
        int getC(){
            return callC;
        }
};

주어진 클래스 D는 아래와 같다:

class D 
{

	int val;
	public:
		//Initially val is 1
		 D()
		 {
		 	val = 1;
		 }


		 //Implement this function
		 void update_val(int new_val)
		 {

			
		 }
		 //For Checking Purpose
		 void check(int); //Do not delete this line.
};

클래스 D를 수정하고 update_val 함수를 implement하여 오직 클래스 A, B 그리고 C에서 정의한 함수만을 가지고 함수를 불러와 값을 조정하여 new_val을 구한다.

new_val은 오직 2,3 그리고 5만을 prime factor로 받는 것이 보장되어 있다.

입력 형식

클래스 D의 update_val 함수를 implement하라. 이 함수는 오직 A, B 그리고 C의 함수만을 이용하여 업데이트한다.

 

제약 사항

new_val은 1보다 크거나 같고 10,000보다 작거나 같다.

주의: new_val은 2,3 그리고 5만을 prime factor로서 취한다.

 

입력 예시

new_val = 30

 

출력 예시

A's func will be called once.
B's func will be called once.
C's func will be called once.

 

설명

초기에, val = 1이다.

A의 함수는 한 번 불리운다.

val = val * 2
val = 2

B의 함수가 한 번 불리운다.

val = val * 3
val = 6

C의 함수가 한 번 불리운다.

val = val*5
val = 30

 

문제

class D 
{

	int val;
	public:
		//Initially val is 1
		 D()
		 {
		 	val = 1;
		 }


		 //Implement this function
		 void update_val(int new_val)
		 {

			
		 }
		 //For Checking Purpose
		 void check(int); //Do not delete this line.
};



void D::check(int new_val)
{
    update_val(new_val);
    cout << "Value = " << val << endl << "A's func called " << getA() << " times " << endl << "B's func called " << getB() << " times" << endl << "C's func called " << getC() << " times" << endl;
}


int main()
{
    D d;
    int new_val;
    cin >> new_val;
    d.check(new_val);

}
더보기

정답

#include<iostream>

using namespace std;

class A
{
    public:
        A(){
            callA = 0;
        }
    private:
        int callA;
        void inc(){
            callA++;
        }

    protected:
        void func(int & a)
        {
            a = a * 2;
            inc();
        }
    public:
        int getA(){
            return callA;
        }
};

class B
{
    public:
        B(){
            callB = 0;
        }
    private:
        int callB;
        void inc(){
            callB++;
        }
    protected:
        void func(int & a)
        {
            a = a * 3;
            inc();
        }
    public:
        int getB(){
            return callB;
        }
};

class C
{
    public:
        C(){
            callC = 0;
        }
    private:
        int callC;
        void inc(){
            callC++;
        }
    protected:
        void func(int & a)
        {
            a = a * 5;
            inc();
        }
    public:
        int getC(){
            return callC;
        }
};

class D : A, B, C
{

	int val;
	public:
		//Initially val is 1
		 D()
		 {
		 	val = 1;
		 }


		 //Implement this function
		 void update_val(int new_val)
		 {
            int iterA = 0; int iterB = 0; int iterC = 0;
			while(new_val % 5 == 0) {
                C::func(val);
                new_val = new_val / 5;
            }
            while(new_val % 3 == 0) {
                B::func(val);
                new_val = new_val / 3;
            }
            while(new_val % 2 == 0) {
                A::func(val);
                new_val = new_val / 2;
            }
		 }
		 //For Checking Purpose
		 void check(int); //Do not delete this line.
};



void D::check(int new_val)
{
    update_val(new_val);
    cout << "Value = " << val << endl << "A's func called " << getA() << " times " << endl << "B's func called " << getB() << " times" << endl << "C's func called " << getC() << " times" << endl;
}


int main()
{
    D d;
    int new_val;
    cin >> new_val;
    d.check(new_val);

}

 

 

 

 

 

©️Hackerrank. All Rights Reserved.