早稲田卒のAI研究者のブログ

データサイエンス、機械学習、競技プログラミング、音楽、勉強

Pythonで茶色コーダーになりました。おすすめの問題を紹介。【AtCoder】

はじめに

今年8月からatcoderを始めて、約1ヶ月で茶コーダーになることができました。

f:id:mashkun:20191018210305p:plain

やっと競技プログラミングのスタート地点に立てた気がします。
茶色になった時、嬉しかったなぁ。


最近、atcoderが更に人気になってきています。
僕が勤めている会社でも最近はじめたって人を多く見かけます。
その理由として、医者からGoogleのソフトウェアエンジニアに転職したLillianさんの転職エントリにatcoderが言及されていたことがあると思っています。
ちなみに僕も、そのエントリを見てからはじめました。
こんな楽しいものを教えてくれたLillianさんに感謝です。(雲の上の存在だけどいつか伝わってほしい)

そんなatcoder。
僕の経験も誰かの参考になればと、この記事を書かせていただきました。(10番煎じですがね)

本記事のターゲット

本記事のターゲットは

最近atcoderを初めて、茶色を目指している方
atcoderを始めたは良いけど何をしたら良いかわからない方

としています。
すでに茶色の方やそれ以上の方には退屈な記事かもしれませんが、ご了承ください。

茶コーダーのレベル


茶コーダーのレベルについては、atcoder社社長のchokudaiさんが以下のように述べています。

学生で茶色なら優秀だがエンジニアとしてはちょっと物足りない。派遣とかで来たエンジニアが茶色あれば一安心。

 引用:
AtCoder(競技プログラミング)の色・ランクと実力評価、問題例 - chokudaiのブログ

chokudaiさんは柔らかく言ってくださってますが、要するに、エンジニアで茶色ならまだまだ実力不足ってことですね。
企業で機械学習の研究者として働く身としては、耳が痛いです。
これから更に精進していきます。


茶コーダーになった僕自身が感じる茶コーダーのレベルとしては、

・for, if文等の基本的な関数はググらずに書ける。
・高校数学程度の基本的な数学の知識はある
・アルゴリズムについて基本的なものは少しわかるけど、応用問題は解けない

くらいの感じです。

もちろん、アルゴリズムはわからなくても、簡単な文法で思い通りの実装ができれば、「プログラミングができる人」であることは間違いありません。
そのため、茶色コーダーになることは、「その言語における初心者を脱却する」境界線と言っても過言ではないかもしれません。
したがって、最近プログラミングを始めた方なんかは、まず茶コーダーを目指して勉強するというのもありかと思います。
取り組んでいるうちに、取り組んでいる言語についての知識が増え、実装速度はかなり高まっていくはずです。

茶色コーダーになるには


では、そんな茶コーダーになるためには、何をすればよいのでしょうか。

まずは、使用するプログラミング言語の基本的な文法をしっかり学ぶことが大事です。
例えば、pythonだと、for, if, while, リストの扱い方, 四則演算, 標準入力, 標準出力等です。必須です。
さっさと覚えちゃいましょう。

その次に必要なことは、競技プログラミングの問題に慣れることです。
競技プログラミングの問題って結構独特で、慣れるまで手も足も出ないはずです。
問題を読んでその場で実装するって経験自体、独学の勉強では体験できないはずなので。
そのため、最初のうちは、慣れるためにA問題をひたすら解くのがおすすめです。
覚えたであろう基本文法の練習にもなります。
頑張りましょう。

最後は、ひたすらに様々な問題を解きまくることです。
まずは、ABCのB問題に集中して解いてみてください。
最初は厳しいと思いますが、段々と解けるようになるはずです。
そして、難なくB問題が解けるようになったら、C問題にもチャレンジしてみてください。
茶色コーダーになるには、B問題が解けないと話になりません。
反対に考えると、B問題が難なく解けるようになれば、茶色コーダーに近づいている証拠です。
頑張っていきましょう。

アルゴリズムに関しては、解いた問題で必要だったものを勉強し、基本的な問題は解けるようにするというレベルで問題ありません。
僕は深い知識なく茶色になれてしまったので。

おすすめ問題

最近のコンテストの中で、練習におすすめな3問(A, B, C問題)を紹介します。

1問目

atcoder.jp

if文、文字列出力という基本的な文法を利用しつつ、問題のまま実装するのではなく、少し式の解釈を必要とする良問です。

以下、僕の実装例を書いておきます。

A_B = list(map(int, input().split()))
if (A_B[0] + A_B[1])%2 == 0:
    K = (A_B[0] + A_B[1])/2
    print(int(K))
else:
    print('IMPOSSIBLE')

2問目

atcoder.jp

atcoderでありがちな、「初期値0の変数にfor文で値を足していく」という問題です。
単純にfor文の練習だけではなく、リストの扱い方、ループ内でのif文の使い方も練習できます。
ぜひ解いてみてください。
以下、僕の実装例

n = int(input())
AL = list(map(int,input().split()))
BL = list(map(int,input().split()))
CL = list(map(int,input().split()))
ans = 0
tmp = AL[0]-1
for i in AL:
    i = i-1
    ans += BL[i]
    if tmp == i-1:
        ans += CL[tmp]
    tmp = i
print(ans)

3問目

atcoder.jp


C問題はこちらの問題が練習におすすめ。
問題を読んで、そのまますぐ実装は難しいです。
一旦、問題を解釈し、どのようなときに具材の価値が最大になるのかを考える必要があります。
ぜひ取り組んでみてください。
以下僕の実装例

n = int(input())
vL = list(map(int,input().split()))
vL_sort = sorted(vL)
vL_sum = (vL_sort[0] + vL_sort[1])/2
if n >= 2:
    for i in range(2,n):
        vL_sum = (vL_sum+vL_sort[i])/2
print(vL_sum)

おすすめのサイト

圧倒的にAtcoder Problemsです。

https://kenkoooo.com/atcoder/#/table/


問題の難易度が色分けされていて、練習に最適です。
その他にも、自分が解いた問題が表示されたり、続けた日数が記録されたりとモチベーション管理にもなります。
僕もかなり活用しています。
例えば、今僕は緑コーダーを目指しているので、難易度緑の問題を中心に取り組んでいます。
皆さんも自分のレベルに合った使い方で、ぜひどんどん活用してみてください。

おわりに

本記事では、僕が思う茶色コーダーになる方法について書きました。
参考になった方が一人でもいれば本当に嬉しいです。

競技プログラミングはかなり楽しいです。
解けないと悔しい。解けると嬉しい。
そんな競技プログラミング。慣れるまで時間はかかりますが、ぜひ皆さん取り組んでみてくださいね。