前調べなしにAtCoderに参加して戸惑った人のための最低限知るべきこと！

# はじめに
先日初めて`AtCoder`という競技プログラミングのコンテストに参加しました！
アカウントだけは以前に作成していました。

友人が毎週土曜日の21時にコンテストに参加しているので私もそのコンテストに参加しようと思い、ホームページで時間が一致するコンテストを見つけて参加登録をしました。

そして、コンテストの時間になり問題を見たのですが、色々コンテスト自体のことでわからないことがあり、時間をとってしまい、しまいには途中でエラーの理由がわからず(アルゴリズムは正しい)コンテストが終了しました。

初めて参加する人が当日そんな状況になっても大丈夫なように、そしてこれからコンテストに参加する人のために最低限知っといたほうがいいことをまとめます。

# 開発環境
- Python3
- JupyterNotebook

# 問題

私が参加した[エイシングプログラミングコンテスト2021（AtCoder Beginner Contest 202）](https://atcoder.jp/contests/abc202)の問題を例に説明します。

## 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()`を使って受け取ることができるそうです。また、入力は色々な形式で行われるので、以下のサイトなどを参考にして入力を受け取るとよいです。

https://qiita.com/jamjamjam/items/e066b8c7bc85487c0785

また、結果は標準出力することで答えとして提出することができます。`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問題](https://atcoder.jp/contests/abc202/tasks/abc202_c)で問題が起きました。
ずっとRuntimeErrorが発生してしまい。解決策がわからずコンテストが終了しました。

AtCoderでおこるRuntimeError(RE)については[公式](https://atcoder.jp/contests/abc074/glossary?lang=ja)に乗っています。

解いた問題ですが、以下のような問題でした。

![bandicam 2021-05-23 12-54-47-044.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/426cd9ce-f138-ff0b-3c85-e9e24dbed8a2.jpeg)

そして、エラーで止まっていたコードは以下です。

```
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](https://teratail.com/questions/339804)に質問して気づきました。
コピーしたので入力は大丈夫だろうとみていなかったのが問題でした。

では、どうやって気づけばよかったのでしょうか。
ローカルではもちろんエラーにならずよろしくやってくれていました。

実は、後々気づいたのですが、AtCoderでは[コードテスト](https://atcoder.jp/contests/abc202/custom_test)というページがあり、デバックが可能です。`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問題以降が考えないと解けないなと思いましたので、解けるように頑張っていきたいです。

最後に[私のアカウント](https://atcoder.jp/users/jinwatanabe)を張って終わります。

# 参考サイト

https://atcoder.jp/contests/abc202

https://qiita.h/ajamjamjam/items/e066b8c7bc85487c0785

https://atcoder.jp/contests/abc202/tasks/abc202_c

https://atcoder.jp/contests/abc074/glossary?lang=ja

https://teratail.com/questions/339804

https://atcoder.jp/contests/abc202/custom_test

https://atcoder.jp/users/jinwatanabe