본문 바로가기

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

[Hackerrank] 36. Magic Spells

36. Magic Spells

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

1. 과제

과제 설명

비디오 게임을 하는 동안, 매우 강력한 암흑의 마법사와 싸워야 한다.

그가 거리를 두며 마법을 영창하는동안, 오직 수 초만이 반응하도록 시간이 주어지고 역영창을 해야 한다.

역영창이 효과가 있기 위해서는 상대방이 어떤 영창을 하는지 알아야 한다.

마법사는 그의 마법을 영창하기 위해 스크롤을 사용하고 가끔씩 그의 스테미나에 저장되어 있는 일반 영창을 사용한다.

이 경우, 영창에서 스크롤의 이름을 추출해야 한다.

그 다음 이 새 영창이 영창 저널의 공식과 얼마나 비슷한지 알아야 한다.

에디터의 잠겨있는 코드의 내용을 분석하고 counterspell 함수를 완성하라.

이 챌린지를 해결하기 위해 Dynamic cast를 공부하고 아이디어를 얻어라!

 

Input Format

마법사는 t 스크롤을 읽고, 나는 이를 알 수 없다.

매 시간마다 그는 영창을 외우고, 이 영창은 나의 counterspell 함수에 인자로 넘어온다.

 

Constraints

t는 1보다 크거나 같고 100보다 작거나 같다.

s의 절댓값은 1보다 크거나 같고 1000보다 작거나 같다. 여기서 s는 스크롤의 이름이다.

각 스크롤 이름 s는 대,소문자로 이루어져 있다.

 

Output Format

주어진 영창을 알아내고 그것의 이름과 힘을 출력해라.

만약 일반 영창이라면 영창 이름과 영창 저널에 포함되어 있는 하위 시퀀스를 구하라.

모든 하위 시퀀스에서 새로운 줄에 가장 긴 영창의 길이를 찾은 뒤 출력해라.

 

Sample Input

3
fire 5
AquaVitae 999 AruTaVae
frost 7

 

Sample Output

Fireball: 5
6
Frostbite: 7

 

Explanation

Fireball과 Frostbite는 흔한 영창 종류이다.

AquaVitae는 흔하지 않고 영창 저널에서 AruTaVae와 비교한다면 다음 시퀀스를 얻을 수 있다: AuaVae

 

문제

#include <iostream>
#include <vector>
#include <string>
using namespace std;

class Spell { 
    private:
        string scrollName;
    public:
        Spell(): scrollName("") { }
        Spell(string name): scrollName(name) { }
        virtual ~Spell() { }
        string revealScrollName() {
            return scrollName;
        }
};

class Fireball : public Spell { 
    private: int power;
    public:
        Fireball(int power): power(power) { }
        void revealFirepower(){
            cout << "Fireball: " << power << endl;
        }
};

class Frostbite : public Spell {
    private: int power;
    public:
        Frostbite(int power): power(power) { }
        void revealFrostpower(){
            cout << "Frostbite: " << power << endl;
        }
};

class Thunderstorm : public Spell { 
    private: int power;
    public:
        Thunderstorm(int power): power(power) { }
        void revealThunderpower(){
            cout << "Thunderstorm: " << power << endl;
        }
};

class Waterbolt : public Spell { 
    private: int power;
    public:
        Waterbolt(int power): power(power) { }
        void revealWaterpower(){
            cout << "Waterbolt: " << power << endl;
        }
};

class SpellJournal {
    public:
        static string journal;
        static string read() {
            return journal;
        }
}; 
string SpellJournal::journal = "";

void counterspell(Spell *spell) {

  /* Enter your code here */

}

class Wizard {
    public:
        Spell *cast() {
            Spell *spell;
            string s; cin >> s;
            int power; cin >> power;
            if(s == "fire") {
                spell = new Fireball(power);
            }
            else if(s == "frost") {
                spell = new Frostbite(power);
            }
            else if(s == "water") {
                spell = new Waterbolt(power);
            }
            else if(s == "thunder") {
                spell = new Thunderstorm(power);
            } 
            else {
                spell = new Spell(s);
                cin >> SpellJournal::journal;
            }
            return spell;
        }
};

int main() {
    int T;
    cin >> T;
    Wizard Arawn;
    while(T--) {
        Spell *spell = Arawn.cast();
        counterspell(spell);
    }
    return 0;
}

 

더보기

정답

#include <iostream>
#include <vector>
#include <string>
using namespace std;

class Spell { 
    private:
        string scrollName;
    public:
        Spell(): scrollName("") { }
        Spell(string name): scrollName(name) { }
        virtual ~Spell() { }
        string revealScrollName() {
            return scrollName;
        }
};

class Fireball : public Spell { 
    private: int power;
    public:
        Fireball(int power): power(power) { }
        void revealFirepower(){
            cout << "Fireball: " << power << endl;
        }
};

class Frostbite : public Spell {
    private: int power;
    public:
        Frostbite(int power): power(power) { }
        void revealFrostpower(){
            cout << "Frostbite: " << power << endl;
        }
};

class Thunderstorm : public Spell { 
    private: int power;
    public:
        Thunderstorm(int power): power(power) { }
        void revealThunderpower(){
            cout << "Thunderstorm: " << power << endl;
        }
};

class Waterbolt : public Spell { 
    private: int power;
    public:
        Waterbolt(int power): power(power) { }
        void revealWaterpower(){
            cout << "Waterbolt: " << power << endl;
        }
};

class SpellJournal {
    public:
        static string journal;
        static string read() {
            return journal;
        }
}; 
string SpellJournal::journal = "";

void counterspell(Spell *spell) {

  /* Enter your code here */
    Fireball* fbPtr = dynamic_cast<Fireball*>(spell);
    Frostbite* frstbPtr = dynamic_cast<Frostbite*>(spell);
    Thunderstorm* tdPtr = dynamic_cast<Thunderstorm*>(spell);
    Waterbolt* wbPtr = dynamic_cast<Waterbolt*>(spell);
    if(fbPtr != nullptr) {
        fbPtr->revealFirepower();
    }
    else if(frstbPtr != nullptr) {
        frstbPtr->revealFrostpower();
    }
    else if(tdPtr != nullptr) {
        tdPtr->revealThunderpower();
    }
    else if(wbPtr != nullptr) {
        wbPtr->revealWaterpower();
    }
    else {
        string mySpell = spell->revealScrollName();
        string myJournal = SpellJournal::read();
        int m = mySpell.length();
        int n = myJournal.length();
        vector<vector<int>> vLCSMatrix(m+1, vector<int>(n+1));
        for(int i = 1; i <= m; i++) {
            for(int j = 1; j <=n; j++) {
                if(mySpell[i-1] == myJournal[j-1]) {
                    vLCSMatrix[i][j] = 1 + vLCSMatrix[i-1][j-1];
                }
                else {
                    vLCSMatrix[i][j] = max(vLCSMatrix[i-1][j], vLCSMatrix[i][j-1]);
                }
            }
        }
        cout << vLCSMatrix[m][n] << endl;
    }
}

class Wizard {
    public:
        Spell *cast() {
            Spell *spell;
            string s; cin >> s;
            int power; cin >> power;
            if(s == "fire") {
                spell = new Fireball(power);
            }
            else if(s == "frost") {
                spell = new Frostbite(power);
            }
            else if(s == "water") {
                spell = new Waterbolt(power);
            }
            else if(s == "thunder") {
                spell = new Thunderstorm(power);
            } 
            else {
                spell = new Spell(s);
                cin >> SpellJournal::journal;
            }
            return spell;
        }
};

int main() {
    int T;
    cin >> T;
    Wizard Arawn;
    while(T--) {
        Spell *spell = Arawn.cast();
        counterspell(spell);
    }
    return 0;
}

 

 

 

 

 

 

 

©️Hackerrank. All Rights Reserved.