EurekaMoments

ロボットや自動車の自律移動に関する知識や技術、プログラミング、ソフトウェア開発について勉強したことをメモするブログ

Track Testでコーディングテストを受ける前に知っておくべきこと

目的

採用選考の一環でコーディングテストを実施する際に、
Track Testというオンラインプラットフォームを使って
テストを実施する会社が最近は多いようです。

自分も最近の転職活動で2度ほど受検したのですが、
慣れ親しんでいたLeetCodeとはまた少し違った形式だった
ので1回目の受験時は戸惑って無駄に時間を使ってしまいました。

そこで今回は、今後Track Testでコーディングテストを受ける
かもしれない人達向けに、事前に知っておくと役立つもの
について紹介しようと思います。

目次

Track Testとは

Track Testの詳細については、こちらのリンクを参照ください。
tracks.run

LeetCodeとの違い

実際に受検してみて分かった、LeetCodeとの違いとしては
下記のものがありました。

1. 必要なヘッダーファイルをインクルードする

LeetCodeの場合はヘッダーファイルのインクルードをする必要なく
C++のコードを書いてビルドとテストができますが、Track Testの
場合は自分でいちいち必要なヘッダーファイルをインクルードする
必要があります。

日頃からC++のコードを書いてる人なら大した問題ではないかも
しれませんが、LeetCodeと比べるとやはり面倒に感じるので、
そういう違いがある程度に認識はしておくべきかと思います。

2. 入力はテキストベース

LeetCodeでは、単純にアルゴリズムを実行するコードを書くことだけに
集中できますが、Track Testでは各問題においてさまざまなテストケースの
入力が用意されており、それらは全てテキストファイルから読み取られる
仕組みとなっています。

そのため、肝心なアルゴリズムのコードを書く前に、そのテキストファイルから
入力データを抽出して、アルゴリズムへ入力する形に変換する前処理を行う
コードを自分で書く必要があります。

こういうテキストを処理するコードを書き慣れてないと、それだけで
余計な時間を使ってしまうので、それに関して自分が使うの言語の
復習とコーディング練習はしておくと良いでしょう。

テキストから入力データを抽出するC++コード

ここでは、先に述べたようなテキスト入力を処理するのに
役立つC++コードを紹介します。

まずはこちらのように、テキストファイルの各行を指定した文字で
区切り、区切った行をstring配列に格納して出力するコードを
書きます。テキストファイル内には複数行の文字列が書かれており、
それらは' 'のような空白で区切られていることが多いです。
そのため、こういった1行の文字列を指定文字で区切るという処理は
高確率で必要になります。

std::vector<std::string> split(const std::string& str_in, char delim) {
    std::vector<std::string> elements;

    std::stringstream stream_in(str_in);
    std::string item;
    while (std::getline(stream_in, item, delim)) {
        if (!item.empty()) {
            elements.push_back(item);
        }
    }

    return elements;
}

そして、上記のコードをmain関数内でこちらのように使います。

int main() {
    for (std::string line; std::getline(std::cin, line);) {
        std::vector<std::string> split_line;
        split_line = split(line, ' ');
    }
}

これは、まず入力されたテキストファイルから、中に書かれた行を
1行ずつ読み出し、それをsplit関数で空白一文字で区切っていく
というものです。

あとは、ここで区切られた各文字を数値に変換するなどして、
アルゴリズムに食わせてやるようにすればオッケーです。

こういう前処理コードは普段書くことが少ないと、いざテストで
書かなきゃいけなくなった際に慌てるので、スムーズに書けるように
日頃から訓練しておきましょう。