はじめに
先日初めてAtCoder
という競技プログラミングのコンテストに参加しました!
アカウントだけは以前に作成していました。
友人が毎週土曜日の21時にコンテストに参加しているので私もそのコンテストに参加しようと思い、ホームページで時間が一致するコンテストを見つけて参加登録をしました。
そして、コンテストの時間になり問題を見たのですが、色々コンテスト自体のことでわからないことがあり、時間をとってしまい、しまいには途中でエラーの理由がわからず(アルゴリズムは正しい)コンテストが終了しました。
初めて参加する人が当日そんな状況になっても大丈夫なように、そしてこれからコンテストに参加する人のために最低限知っといたほうがいいことをまとめます。
開発環境
- Python3
- JupyterNotebook
問題
私が参加したエイシングプログラミングコンテスト2021(AtCoder Beginner Contest 202)の問題を例に説明します。
1. あれどうやって入力すればよいの?
まず1問目でかなり時間をとってしまいました。
以下が問題です。
問題文
高橋君が 3つのサイコロを振ったところ、出た目はそれぞれ a,b,cでした。
これらのサイコロについて、出た目とは反対の面が表す整数を足し合わせた値を求めてください。
ただし、高橋君が振るサイコロは全て一般的な立方体の 6面ダイスであり、ある面とその反対側の面が表す整数を足すと 7になります。
という問題でした。
コードはサクッと作成し、このように書きました。
a_r = 7 - a
b_r = 7 - b
c_r = 7 - c
ans = a_r + b_r + c_r
そこで思いました。このa,b,c
ってどのようにすればよいのだろう。
調べたところ、AtCoderでは、入力が採点で自動的にされるので、input()
を使って受け取ることができるそうです。また、入力は色々な形式で行われるので、以下のサイトなどを参考にして入力を受け取るとよいです。
また、結果は標準出力することで答えとして提出することができます。Print
で最後結果を表示しましょう。
最終的に以下のようなコードになりました。
a, b, c = map(int, input().split())
a = int(a)
b = int(b)
c = int(c)
a_r = 7 - a
b_r = 7 - b
c_r = 7 - c
print(a_r + b_r + c_r)
2. RuntimeErrorで悩まされる
次はC問題で問題が起きました。
ずっとRuntimeErrorが発生してしまい。解決策がわからずコンテストが終了しました。
AtCoderでおこるRuntimeError(RE)については公式に乗っています。
解いた問題ですが、以下のような問題でした。
そして、エラーで止まっていたコードは以下です。
n = int(input())
list_x = []
for i in range(n):
array = list(map(int, input().split()))
list_x.append(array)
a = list_x[0]
b = list_x[1]
c = list_x[2]
nlist = []
for c_i in c:
nlist.append(b[c_i-1])
ans = 0
for a_i in a:
ans = ans + nlist.count(a_i)
print(str(ans))
また標準入力の部分は同じような入力の例題をネットで探してコピー
してきました。
実はこれが問題でした。この問題入力のfor分はA,B,C
の3回で固定でした。
今のままではN
の値でforの回数が変わってしまいます。
このことにteratailに質問して気づきました。
コピーしたので入力は大丈夫だろうとみていなかったのが問題でした。
では、どうやって気づけばよかったのでしょうか。
ローカルではもちろんエラーにならずよろしくやってくれていました。
実は、後々気づいたのですが、AtCoderではコードテストというページがあり、デバックが可能です。RE
に悩まされたら利用していきましょう。
最終的には以下のコードで正解となりました。
n = int(input())
list_x = []
for i in range(3):
array = list(map(int, input().split()))
list_x.append(array)
a = list_x[0]
b = list_x[1]
c = list_x[2]
nlist = []
for c_i in c:
nlist.append(b[c_i-1])
ans = 0
for a_i in a:
ans = ans + nlist.count(a_i)
print(str(ans))
3.結果は標準出力する
先ほども述べましたが、答えが求まったらprint
などで出力すればOKです。
さいごに
AtCoderに初参加しましたが、問題を解く以外のところで詰まってしまい痛いデビューとなってしまいました。
この入力に関しては種類がいくつかあるので、すべて把握しておくべきでした。
しかし、思ったよりも楽しく週1日90分なら続けられそうだなと思いました。
E問題以降が考えないと解けないなと思いましたので、解けるように頑張っていきたいです。
最後に私のアカウントを張って終わります。
参考サイト