【競技プログラミング用】Java入出力一覧

# 目次
* [この記事の目的](#この記事の目的)
* [入力](#入力)
* [出力](#出力)
* [解答例](#解答例)
* [終わりに](#終わりに)
* [参考文献](#参考文献)

# この記事の目的
Javaを始めてみてとりあえず動くのを確認してみたくて競技プログラミング…
あれ？入出力どうやるの？
Scannerで受け取って…わからない！！という方向け。

あと自分の学習記録として。

# 入力
## １文字受け取り
```
import java.io.BufferedReader;
import java.io.InputStreamReader;
 
public class Main {
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        // 文字列
        String str = br.readLine();        

        // 整数
        int num = Integer.parseInt(br.readLine());
        long num = Long.parseLong(br.readLine()); // 絶対値が2147483648以上ならこっち        

        // 小数
        float fnum = Float.parseFloat(br.readLine());

        br.close();
	}
}
```
## 複数文字受け取り
```
import java.io.BufferedReader;
import java.io.InputStreamReader;
 
public class Main {
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        // 文字列
        String[] strs = br.readLine().split(" ");

        // 整数
        String[] strs = br.readLine().split(" ");
        int[] nums = new int[n]; // nは長さ
        for (int i = 0; i < n; i++) {
            nums[i] = Integer.parseInt(strs[i]);
        }

        // 小数
        String[] strs = br.readLine().split(" ");
        float[] fnums = new float[n]; // nは長さ
        for (int i = 0; i < n; i++) {
            fnums[i] = Float.parseFloat(strs[i]);
        }

        br.close();
	}
}
```

## 複数行受け取り
基本的には上の工程をforで回せばよいだけ
例えばH行W列の整数入力が与えられたら、下記のようにすればよい。
(下の例では2行3列を想定している)
```
import java.io.BufferedReader;
import java.io.InputStreamReader;
 
public class Main {
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int h = 2;
        int w = 3;
        
        int[][] nums = new int[h][w]; 
        for (int i = 0; i < h; i++) {
            String[] strs = br.readLine().split(" ");
            for (int j = 0; j < w; j++) {
                nums[i][j] = Integer.parseInt(strs[j]);
            }
        }

        br.close();
	}
}
```

もちろんlongやStringでうけとることもあるとおもうが、
その場合は上のセクションですでに説明済みなので割愛。

# 出力
## 1文字出力
```
public class Main2 {
    public static void main(String[] args) {
        int n = 5;

        // 整数でも文字列でもこれで対応できる
        System.out.println(n);
    }
}
```
## 複数文字出力
実はこれが一番使いそう。
下の例では文字列の一番最後に" "が余分に加えられているが、AtCoderでは見逃してくれる様子。
```
public class Main {
    public static void main(String[] args) {
    
        // 文字列ならこれを使う
        //String[] arrayString = new String[n];

        // 小数のならこれを使う
        //float[] arrayFloat = new float[n];

        // 配列の長さ
        int n;

        // 今回は整数の場合を試す
        int[] arrayInt = new int[n];

        // arrayIntへの挿入がここに入る

        for (int i : arrayInt) {
            System.out.print(i + " ");
        }
    }
}
```
## 複数行出力
```
public class Main2 {
    public static void main(String[] args) {

        // 文字列の場合
        //String[][] arrayString = new String[2][3];

        // 小数の場合
        //float[][] arrayFloat = new float[2][3];


        // 整数の場合
        int[][] arrayInt = new int[2][3];

        // 整数の代入処理(一応例を示す)
        for (int i = 0; i < 2; i++) {
            for (int j = 0; j < 3; j++) {
                arrayInt[i][j] = i * 3 + j;
            }
        }

        // arrayListsへの挿入がここに入る
        for (int[] nums : arrayInt) {
            for (int num : nums) {
                System.out.print(num + " ");
            }
            // 改行処理
            System.out.println();
        }
    }
}
```
```terminal:実行結果
0 1 2 
3 4 5 
```
# 解答例
例としてAtcoderの初心者向けコンテストのさらに初心者向けの問題に回答してみた。
複数行出力の良い例が見つからなかったので、もし見つけた方は教えてほしい。

### 問題：
[ABC287A](https://atcoder.jp/contests/abc287/tasks/abc287_a)

### 解答例：
```
import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Main {
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        // 整数の受け取り
        int n = Integer.parseInt(br.readLine());
        int cnt = 0;
        for (int i = 0; i < n; i++) {
            // 文字列受け取り
            String str = br.readLine();
            if (str.equals("For")) {
                cnt++;
            }
        }
        br.close();
        int num = n / 2;
        // 出力
        if (cnt > num) {
            System.out.println("Yes");
        } else {
            System.out.println("No");
        }
    }
}
```

### 問題：
[ABC287B](https://atcoder.jp/contests/abc287/tasks/abc287_b)
### 解答例：
```
import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Main {
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int n = Integer.parseInt(br.readLine());
        String[] strs = br.readLine().split(" ");
        br.close();

        int[] s = new int[n];
        for (int i = 0; i < n; i++) {
            s[i] = Integer.parseInt(strs[i]);
        }

        int[] a = new int[n];
        for (int i = 0; i < n; i++) {
            if (i == 0) {
                a[0] = s[0];
                continue;
            }
            a[i] = s[i] - s[i - 1];
        }

        for (int num : a) {
            System.out.print(num + " ");
        }
    }
}
```



# 終わりに
正直言うと今回紹介したのは全くベストプラクティスではない。
大量の入力がある場合には（おそらく）より高速な入出力が必要になると思う。
そのときには各自で調査してみてほしい。

そして教えてほしい。教えてください。

# 参考文献
[ユニークビジョンプログラミングコンテスト2023 新春 (AtCoder Beginner Contest 287)](https://atcoder.jp/contests/abc287)