プログラミングの備忘録

プログラムをつくる過程を残すもの

競技プログラミングを始めてみる

こんにちは。
今回は「競技プログラミング」というものを始めてみます。


「QuizKnock」というYouTubeチャンネルをご存じでしょうか。
そこで「好きになっちゃう放課後」シリーズなるものがありまして、「プログラミング」が取り上げられた回があります。

(常々、「化学が好きになっちゃう放課後」をやってくれと、なんなら自分を呼んでくれとまで思っているのですが、なかなか実現しません…)

そこで鶴崎さんが「競技プログラミング」というものがあると紹介をしていました。
以前から存在は知っていたのですが、記憶の奥底に眠っていたようで、ブログを始めたこともあるので記事にしてみようと思って今に至ります。


使用言語は、練習もかねてやりたいので、以前にちょこっと触れたpythonでやってみます。
(速さ的にはC言語が良いらしいです。)


目次


競技プログラミングとは

出された問題に対して答えを出すプログラムをいかに速く書くかを競うものです。
場合によっては、そのプログラムの実行速度も重要になってきます。

「electronic sports」という言葉からすると、これもひとつのeスポーツと言えるかもしれません。


競技プログラミング」と検索すると多くのサイトが出てきますが、今回は「AtCoder」というサイトの競技プログラミングに参加してみます。

atcoder.jp

海外にも同様のサイトはありますが、初心者なのでまずは日本語で書かれているものを選んだ方が良いかと考えました。


練習する

それでは、競技プログラミングとはどんなものかを知るためにも練習問題をやってみます。
(会員登録が必要です。)

こちらの「practice contest」で練習します。

atcoder.jp


「参加登録」ボタンを押すことで、そのコンテストに参加します。
そうすると、問題や提出結果を見ることができるタブが増えたかと思います。


問題

「問題」のタブから「A - Welcome to AtCoder」を選びます。
すると、問題文が出てきます。

問題文は、

整数a,b,cと、文字列sが与えられます。a+b+cの計算結果と、文字列sを並べて表示しなさい。

というものでした。


先にも書いたとおり、競技プログラミングは入力と出力が基本なので、下にスクロールしていくと入出力の形式が書かれています。

入力は、

a
b c
s

出力は、

a+b+cとsを空白区切りで1行に出力せよ。

とのことでした。


プログラムを書く

ではさっそくプログラムを書いてみます。

まずは入力したいので、入力結果をa、b、c、sそれぞれに代入するコードを書きます。

a = int(input())
b, c = map(int, input().split())
s = input()


入力はinput()で受け取ることができます。

a、b、cは数字なのでint型に変換します。

b、cについては、空白区切りで並べて入力されるので、2つに分ける必要があります。
そこで使うのがsplit()です。
input().split()で、入力を空白(スペース、タブ、改行)で区切ってリスト化します。
同時に、int型に変えるためにmap()でリストの各要素に対してint()を適用しています。

input()のみでは文字列(str型)となるので、sにはそのままで代入しています。


では続いて、a+b+cを計算し、sと並べて出力します。
といっても簡単、

print(a+b+c, s)

で完了です。


以上を合わせると、

a = int(input())
b, c = map(int, input().split())
s = input()

print(a+b+c, s)

となりました。


提出

これを、問題ページの一番下にある提出フォームに書き込んで、言語をPythonに変え、「提出」ボタンを押すと、正誤判定がされます。

結果は以下のように表示されます。

「結果」の部分は、合っていれば「AC」、間違っていれば「WA」がでます。
他にもありますが、マウスオーバーすれば表示してくれるのでその都度対処してください。

今のところは「コード長」「実行時間」「メモリ」は気にしていませんが、恐らく小さい方が良いのだろうとは思います。


以上で、競技プログラミングの流れはつかむことができました。

基本は、問題を読む、プログラムを書く、提出する、という流れです。
プログラム自体は入力、計算、出力という流れになります。


「practice contest」には2問目に「B - Interactive Sorting」というものがありますが、(問題文の初めにも書いてありますが)難易度高めなようなので、さらに練習したいという方は「AtCoder Beginners Selection」に移ってみてください。

atcoder.jp

(ちなみに、「AtCoder Beginners Selection」からは他の方のプログラムも見ることができるので、そこからも学べるかと思います。)


参加する

それでは、実際のコンテストに参加してみます。

AtCoder」ではだいたい毎週末に「AtCoder Beginner Contest」というものが開催されているようなので、まずはそちらに参加してみるのが良いかと思います。


ちょうど4月10日に「AtCoder Beginner Contest 247」というコンテストがあったので参加してみました。

atcoder.jp


結果は…

切りが良い。

与えられた問題を解くのにどうすれば良いかがわからないものが多く、プログラミング技術以前に地頭が悪いなと感じました…笑


まとめ

ここまでで、競技プログラミングに参加する方法と、実際の流れを書いてみました。

プログラミングというよりは数学の問題を解いているような感覚になりました。
そもそも人間の頭でどう計算すれば良いかを考えて、実際の計算は機械にやってもらうというときのためのプログラミングなので、そういうものなのでしょうけれど。

正直、やりたいことをするにはpythonでどう書けばいいかは調べれば出るので、自分はまず傾向と対策をしてその"やりたいこと"を思いつけるようにした方が良いのかもしれません…