본문 바로가기

프로그래머/알고리즘

[해커랭크 C++] Exceptional Server

문제는 다음과 같다

www.hackerrank.com/challenges/exceptional-server/problem

즉, C++의 예외처리를 통해 Sample Output과 같은 에러 형태를 출력해야 한다.

#include <iostream>
#include <exception>
#include <string>
#include <stdexcept>
#include <vector>
#include <cmath>
using namespace std;

class Server {
private:
    static int load;
public:
    static int compute(long long A, long long B) {
        load += 1;
        if(A < 0) {
            throw std::invalid_argument("A is negative");
        }
        vector<int> v(A, 0);
        int real = -1, cmplx = sqrt(-1);
        if(B == 0) throw 0;
        real = (A/B)*real;
        int ans = v.at(B);
        return real + A - B*ans;
    }
    static int getLoad() {
        return load;
    }
};
int Server::load = 0;

int main() {
    int T; cin >> T;
    while(T--) {
        long long A, B;
        cin >> A >> B;

        // typing

    }
    cout << Server::getLoad() << endl;
    return 0;
}

대부분의 코드는 짜여져 있고, //typing 부분만 예외처리 코드를 짜면 된다.

정답은 다음과 같다.

try {
    cout << Server::compute(A,B) << endl;
     } 
catch (bad_alloc& error) {
    cout << "Not enough memory" << endl;
}
catch (exception& error) {
    cout << "Exception: " << error.what() << endl;
}
catch (...) {
    cout << "Other Exception" << endl;
}

우선 조건에 부합하는지 확인하기 위해 try문으로 compute에 input을 넣어보고,

조건에 부합하지 않는 부분은 throw를 받아와야 한다.

핵심은 문제에서 던지는 2가지의 throw를 어떻게 받느냐이다. (negative, not enough memory)

순서 또한 중요하다.

 

문제에 힌트가 있었다.

  • If it fails to allocate the memory that it needs, print Not enough memory.
  • If any other standard C++ exception occurs, print Exception: S where is the exception's error message.
  • If any non-standard exception occurs, print Other Exception.

즉, 문제의 세 조건에 부합하는 catch 문을 써주기만 하면 되었던 것이다.

catch 문의 종류에 대해 더 공부가 필요할 듯.