【GMOリサーチではエンジニアを募集中です】採用情報はこちら!

競技プログラミングについてお話しします

競技プログラミングについてお話しします

※こちらの記事は、弊社インド人エンジニアのプリヤンカさん執筆記事を和訳したものです。
▼英語バージョンはこちら

拙い翻訳ですが、よろしければお読みくださいー!

はじめに

こんにちは !Priyankaです。

現在、GMOリサーチ株式会社でシステムエンジニアとして働いています。 

この会社で実際に提供しているサービスのコードを書くようになってからなんと約3年が経ちました・・・!

 まだまだエンジニアとしては成長段階ですが、どんどん新しいことを成し遂げていきたいですし、常に成長し続けたいと考えています。

引き続き自分のスキルを向上させる方法を探していこうと考えているところです。

競技プログラミングについて書こうと思った理由

世界中の人々と競い合ってみたいと考えたことはありませんか? 

また、自分自身のプログラミングスキルのレベル感を把握してみたいと思いませんか?

私たちは皆、個人的なものであれ専門的なものであれ、あらゆる分野の物事を熟達させるために、現在の自分の長所や短所を知りたいと考えるものだと思います。

あなたのスキルをテストして比較する場合の最善の方法、それ競技プログラミングなのです。

“Compete the world, show what you got” 

競技プログラミングとは?

競技プログラミングは、プログラミングを行う際のマインドや思考方法などを学ぶのに適しています。

皆さんは仕事後、PCの電源を切った後にも自分の書いたコードについて延々と考えてしまうことがありませんか?・・・私はあります。

プログラミングに取り組むことで、コードの書き方を覚えるだけでなく様々な思考法を学ぶこともできることに気づきました。

その結果、あなたが今抱えている問題を様々な側面から見つめることができ、更に創造性とロジックをもって、様々な方法で問題解決に取り組むことができるのです。

プログラミングはチェス同様、脳の運動であり、そしてメンタルスポーツでもあると思います。

世の中の競技プログラミングの主な目標は「プログラマーの論理的思考能力の向上と、難しい状況も打破できるようなコードを書けるようになること」。

そして、プログラミングというメンタルスポーツをインターネット上で行うことを競技プログラミングと呼ぶのです。

競技プログラミングの活用方法

この章では、私なりの競技プログラミングにおけるTipsをご紹介していきます。

  1. 時間と複雑さの調和を理解する
  2. お気に入りのプログラミング言語を選んでみる
  3. データ構造について学ぶ
  4. オンラインのコーディングプラットフォームの内1つを選んでみる
  5. 定期的に行う

下記で詳しく説明します。

(1)時間と複雑さの調和を理解する

ある問題に直面したとしましょう。

この時、この問題に対する解決策が最適でないとプログラムの処理速度が遅くなり、後から再度解決策を選び直すことになります。

このような問題は、その解決策に要する時間を考慮できていなかったために度々発生します。私自身、古いコードの改修作業中に度々このような場面に直面しました。

問題を解決する最善の方法は、最適な解決法を選択することです。

これは、アルゴリズムに要する時間とスペースによって決まります。

したがって、問題に対する最適なソリューションを作成するには、これら2つの概念について学ぶことが非常に重要です。

(2) お気に入りのプログラミング言語を選んでみる

競技プログラミングで成果を出すためにはまず、最も使いやすいプログラミング言語を1つ選択する必要があります。

もしあなたが初心者であれば、学びやすく、かつ構文の分かりやすいPythonという言語をお勧めします。

私個人としても、課題に取り組む際、上記の理由からC++とPythonを好んで使っています。

もしあなたが既にいずれかの競技プログラミングサイトを覗いたことがあれば、ユーザーのほとんどがC++かJavaを使用していることに気づいたのではないでしょうか。

この2つの言語は、他のプログラミング言語より非常に高速なため、プログラマーの間で非常に人気となっています。

(3)データ構造について学ぶ

もしあなたが、実際にプログラマー気分を味わいたいのであれば、最も基本的、そして重要なことはデータ構造とアルゴリズムについて学ぶことです。

問題解決時、何をどこに、そしていつ適用すべきかを考えるに当たってDSAを理解することは必須です。

DSAは、配列、リンクリスト、スタック、キュー、グラフ、ツリー、並べ替え、再帰、トライ、動的プログラミングなどで構成されており、アルゴリズムをを組む際には、どうすればこのデータ構造の組み合わせを最適化することができるかを知っておくべきです。

(4) オンラインのコーディングプラットフォームの内1つを選んでみる

さて、ここまできたら、プログラミング言語を理解し、時間と空間の複雑さを理解し、データ構造とアルゴリズムを理解したことでしょう。

ということで、 次のステップとして、競技プラットフォームであなたのスキルを試してみることをお勧めします!

私はいくつかのオンライン競技プログラミングプラットフォームに挑戦してきたので、紹介していきます。

TopCoder

TopCoderは、オンラインで楽しめる競技プログラミングプラットフォームの1つです。 リストアップされた過去のアルゴリズム課題を、TopCoderがWEB上で提供しているコードエディターを通して編集可能です。ここで提供される人気コンテンツ”Single Round Match”は月に数回開催され、他の参加者たちとスコアを競い合うことができます。

HackerRank

私は学生時代、スキルアップのためにこのプラットフォームを使っていました。また、私の学校では卒業時のスキルテストにも使用されていたと思います。このHackerRankでは、アルゴリズム、数学、SQL、関数型プログラミング、AIなど様々な領域の課題を提供しており、TopCoder同様WEB上で直接コードを編集することが可能です。更にHackerRankの特徴として、企業からの課題に挑戦することで、同時に就職活動を行うことができる点が挙げられます。

CodeChef

CodeChefは、様々なレベルの課題が何百個も提供されているインド生まれの競技プログラミングサービスです。WEB上でコードの編集が可能、そしてスキルレベルに応じて様々なカテゴリに分類された課題のコレクションを閲覧できます。 また経験上、このサイトには専門家レベルの課題も複数用意されているので、かなりメンタルが鍛えられます!

(5) 定期的に行う

優れた競技プログラマーになるためには、ひたむきさや忍耐、そして一貫して取り組む姿勢が重要です。

先ほどご紹介したようなプラットフォーム上で、毎日コツコツとコーディング課題に取り組んでいきましょう。

一度開始したら、ルーティン化して継続することが重要です。

続けることはすごく大変ですし、様々な問題があなたの前に立ちふさがると思います。それでも、しがみついてでも続けることが上達の秘訣になってくると思います。

競技プログラミングは、自分のスキルを使って学習しますが、競うことで他のプログラマーからも多くのことを学ぶことができます。

ある程度の練習をすれば、コードのアルゴリズムとデータ構造を自然に選択して最適化できるようになります。

ここで頑張りきれば、きっとあなたは優れたプログラマーになることができますし、更にコードを愛することになっていくでしょう・・・!

Patience makes life and job Perfect

開発ブログカテゴリの最新記事