はじめに
2021年、明けましておめでとうございます。皆様新年をいかがお過ごしでしょうか。
さて、今年2021年になって個人的に競技プログラミングに本格的に取り組もうと思い、この記事を書いています。というのも、今現在大学3年なのですが、もう時期大学4年になり、授業も少なくなるということで自分が時間が比較的確保できることになります。そこで、競技プログラミングを通してアルゴリズムとデータ構造をもう一度勉強し直そうと思い立ちました。
将来的にエンジニアとしてインターンに参加したり、就職をする上で、コーディングテストは避けては通れないことでしょう。
本記事が、Xcodeを用いてC++で競技プログラミングをするための指南書としてお役に立てば光栄です。
言語はC++
競技プログラミングやインターン・就職の際のコーディングテストではC++が用いられることが多いです。競技プログラミングではコンテストごとに使用可能な言語は異なりますが、ほとんどのコンテストで使うことができ、実行速度が速い、ライブラリが充実しているなどの理由によりC++は人気が高いです。実際に競技プログラミングの回答の6割以上がC++だと言われています。「C++は競技プログラミングやコーディングテストのための言語」と言っている人がいると聞いたこともありますが、C++を使いこなせて損はないと思います。
エディタはXcode
環境はMacを想定しているので、Xcodeを利用していきます。
Atcoder向けの設定
ここで、”Create a new Xcode project" をクリックします。
すると下のようなものが出てくると思います。
ここではどのようなプロジェクトにするかを選べます。例えば、iosのアプリ、apple watchのアプリを作るかなどを選べます。
上のタブの "macOS" を選択して "Command Line Tool" をクリックし、 "Next” をクリックします。
すると、以下のような画面が表示されます。
- Project Name
作りたいアプリケーションの名前です。 - Team
個人だと思うので適当にPersonal Teamでご自身の名前を埋めてしまいましょう。 - Organization Name
特に会社でするプロジェクトでもないと思うので個人名で結構です。
Organization Identifierは自分のニックネームがあるかたは、「com.ニックネーム」としてください(なんでもいい)。 - Language
書きたいプログラミング言語の名前です。ここではC++を選びます。
埋め終えたらNextをクリックし、そのプロジェクトをどこに保存するかを選びます。
main.cppは以下のようになっていると思います。
//
// main.cpp
//
#include <iostream>
int main(int argc, const char * argv[]) {
// insert code here...
std::cout << "Hello, World!\n";
return 0;
}
これは、Hello Worldという文字を画面(コンソール)に出力するというプログラムです。
左上にある再生ボタンみたいなものを押すと(もしくはコマンド+R)、このファイルをコンパイル(機械語に変換)して走らせてくれます。
次に、main.cppと同じ場所にinput.txtを作成。
こうするとinput.txtをXcodeから直接編集できるのでテストデータの入力が楽になります。
input.txtをコードから読み込めるように設定を行う。
Edit Schemeを選択
下記で、"Options" タブを選択し、"Working Directory" を先程のinput.txtが格納されているディレクトリを指定する。
使い回す用のコード
コード部分だけに集中できるように、他の部分はあらかじめ設定する。
// main.cpp
// CppTest
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
int main(int argc, const char * argv[]) {
// input from txt (提出時にこの箇所は削除すること)
std::ifstream in("input.txt");
std::cin.rdbuf(in.rdbuf());
// cinを高速にするためのおまじない
cin.tie(0);
ios::sync_with_stdio(false);
/////////////////////
// Write code below /
/////////////////////
return 0;
}