[java][暇潰し]Paizaでスキルチェックで遊ぶ際の雛形

# 1度サボるとなかなか復帰できないものね。。。
週1ぐらいで記事をアップしようとしてたけど、ネタが無さ過ぎて全然書く気が起きないのだわ。。。
※現状のプロジェクトに満足してないわけじゃないが、同じようなことの繰り返しでとっくに飽きてきてる

# Paizaでスキルチェック（ついでに転職活動も？
QiitaでたまにコラボイベントをしているPaiza。
イベントの景品狙いとか（アマギフしか当たったこと無いが）で試しに登録してみた所、
スキルチェックなるものがあり解いていくと自分のプログラマーとしてのランクがわかったり、
ランクに応じて企業からスカウトやら注目があったりと転職活動にもつながるというわけで、
ダラダラと表に出せないプログラムを組むぐらいなら息抜きに問題解いて、
注目（チヤホヤ）されることでつまらない日々の中で承認欲求満たしています。

**えっ、こんな企業から、こんなポジションで!?**

な、出会いが待っているかもしれませんが、ランクをあげるとホントにその条件で採る気有る？ってくらい色んな企業やエージェントから連絡がアホほどくるので、ここ最近は承認欲求よりも疑心暗鬼の方が満たされています。
<sub>暇潰しに問題解いてるだけなので、連絡くださった企業様やエージェント様方、お返事とかしなくてゴメンナサイ</sub>
<sub>もしそれでも興味があるとかでしたら所属会社に問い合わせいただきまして、お試し短期派遣とかどうですか？（冗談）</sub>

## Javaで問題解くに当たっての雛形
Paizaの問題は基本的に標準入力から値を受け取って、その値を元に指示された問題を解いていくと行ったものになります。
Paizaの方で標準入力からの受取方法のサンプルが公開されているので、基本的にはその雛形に肉付けしていけばOKといった感じになりますが、そのサンプルをそのまま使おうとすると警告が出てしまうため、気になる人は気になって夜しか寝られないかと思いますので、自分用として作った雛形を公開してみようかなという試みです。

### まず公式雛形
サンプル実装されてる問題の概要としては多分こんな感じ（実際こんな感じの問題がアホほど有る

:::note info
以下のようなパラメータが来るので行ごとに`hello = A_N　, world = B_N`と出力するプログラムを組んで下さい。
```text:入力パラメータフォーマット
N
A_1 B_1
A_2 B_2
…
A_N A_N
```

```text:入力パラメータサンプル
2
2 5
3 4
```
```text:期待する出力
hello = 2 , world = 5
hello = 3 , world = 4
```
※Nは出力行数（処理しないといけない行数）
※A_N, B_Nは数値
:::


```java:Paiza公式の雛形
import java.util.*;

public class Main {
    public static void main(String[] args ) throws Exception {
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        for (int i = 0; i < N; i++) {
            String token1 = sc.next();
            String token2 = sc.next();
            System.out.println("hello = " + token1 + " , world = " + token2);
        }
    }
}
```
で、問題の警告はコレ　→　`Resource leak: 'sc' is never closed`

**あ～、警告出てるようじゃダメかぁ。Scannerはね、閉じとかなきゃ。**

そう、文末（forの後）に `sc.close()` を呼び出して上げて、Scannerを閉じて上げる必要があるのですよ。
<sub>mainだから実行終わったら勝手に閉じるやろ？というのはおいておいて。。。</sub>

このような閉じなきゃいけないものを閉じないで実装しても大丈夫という考えになってしまうと、
処理によってはメモリリークだったり消せないファイルの原因になったりするので、
日頃からの実装で気をつけないといけないという認識を持ってほしいんだわ。

### 個人的雛形
前提として、PaizaにはS・A・B・C・Dのランクがありそれぞれのランクの問題IDみたいなのが`X999`形式（例：D031:分から秒へ 　みたいな形）なので、クラス名はその名前で作っているよ。
※でも実際の問題はMainクラスに実装しなきゃいけないから注意ね!!
→mainメソッドだけ貼り付けて提出すればOK（importもたまに必要だから気をつけるのです

```java:個人的な雛形
import java.util.*;

/** C031:時差を求めたい */
public class C031 {
  public static void main(String[] args) {
    try (Scanner sc = new Scanner(System.in)) {
      // ここに処理を書いていく
    }
  }
}
```
何が違うのか？

`main`メソッドに付いていた`throws Exception`をさよならバイバイ
→メソッド内でtryしてるので例外をThrowsするような記述は不要となったため
→catchもホントはちゃんと書いて制御しないといけないけど省略しちゃった

`Scanner`の変数を`try`の括弧内で生成
→`Scanner`は`Closeable`をimplしてるので`try`で生成した場合、
　tryを抜けたタイミングで勝手にcloseされる（ってぐらいの理解で十分？）ため、
　`sc.close()`を明示的に書かなくてもヨシ!!

とまぁ、別に何も特別なことは書いてないんだけど、変な警告出てる状態で実装・提出するのも気持ち悪いので、あくまで個人的に書いている方法を公開してみたということで。
<sub>それぐらいしか書くネタがなくてゴメンナサイ</sub>

# ちょっとした小技記述
Paizaの問題で出てくるパラメータの形式で以下のようなものがあるんですが、、、
`1 2 3 4 5`
要は、1行の中に半角スペース区切りで数値が複数ある【文字列】。

これを`int[]`や`List<Integer>`に変換して処理したいって時が多々あるんですが、
バカ正直に入門書みたいな書き方で書いていると見にくい・行数をやたら喰うという問題が有るため、
1行で書く書き方をどうぞ（少しでもネタになれば。。。

```java:数値文字列を配列やListに変換する奴
// ここで登場するscという変数は以下の処理で生成したScanner変数ね！
// try (Scanner sc = new Scanner(System.in))

// バカ正直に書いた場合
// String　→　int[]変換
String[] strs = sc.nextLine().split(" ");
int[] ints = new int[strs.length];
for(int i = 0; i < strs.length; i++) {
  ints[i] = Integer.parseInt(strs[i]);
}

// String　→　List<Integer>変換
// String[] strsをそのまま使うよ
List<Integer> list = new ArrayList<>();
for(String s: strs) { // インデックス番号が必要ないので拡張For文でOK
  list.add(Integer.parseInt(s));
}

// ものぐさが書く1行変換
// String[] strsをそのまま使うよ
// String　→　int[]変換
int[] ints2 = Arrays.stream(strs).mapToInt(Integer::parseInt).toArray();

// String　→　List<Integer>変換
List<Integer> list2 = Arrays.stream(strs).map(Integer::valueOf).toList();
```
Java8からのStreamを使ってチェーンな書き方を用いて1行で書いてます。
ちなみに`int[]`から`List<Integer>`への変換もStreamを使えば楽々に出来たり。
→intは**プリミティブ**だからList<int>には出来ないためIntegerへの変換が必要となる

```java:int[]からList<Integer>への変換
int[] i = { 1, 2, 3, 4, 5 };
List<Integer> list = Arrays.stream(i).boxed().toList();
```
単純に`boxed()`を呼び出してあげることで、プリミティブ→オブジェクトに変換するだけ！

# Paizaの問題について
新人～3年生ぐらい or 別言語へのスキルチェンジをするに当たっての1000本ノックとしてやるにはいいのかなと思います。
特に新人はD～Cあたりがサラサラっと解けるぐらいになっていてくれると、プロジェクトに入れても頭数として0.5～0.8人月ぐらいの戦力扱いできるのかなと思います。
※大抵は【研修上がりの新人なんか何も出来ないだろう】からと、赤覚悟かお金に余裕のあるプロジェクトに成果ほぼ0人月扱いでブッ込む or ベテランのバーター扱いで入れて、3ヶ月ぐらいで0.5人月ぐらいの人材に育てる（勝手に育て!!）って感じでしょう。。。

転職のツールとして使いたいのであれば、Aランク以上は取ってないと、スカウトなどの注目される数と質と熱量的なのが全然異なってくるので、今の実力を試す機会として登録して息抜きに問題といて承認欲求満たされるのもありかなと思います。
<sub>なんかPaizaの回し者みたいな締めになっちゃったけど、まぁいいや</sub>