[paiza]スキルチェック見本問題 Java 指定要素があるかの判定 ・要素の種類数　continueとは　(paizaランク D 相当)

<h2>初めに</h2>
今回以下の2つの問題に挑戦しました。

https://paiza.jp/works/mondai/array_utilization_primer/array_utilization_primer__exist

https://paiza.jp/works/mondai/array_utilization_primer/array_utilization_primer__kind

数日スキルチェック問題に取り組んでいないと、なんだか鈍るというか、
どういう道筋で解くのか浮かばなくなります:frowning2:

今回も躓きつつも、学びがありました！

<h2>①指定要素があるかの判定</h2>

https://paiza.jp/works/mondai/array_utilization_primer/array_utilization_primer__exist

```
配列 A の要素数 N と整数 K , 配列 A の各要素 
A_1, A_2, ..., A_N が与えられるので、A に K が 1 つでも含まれている場合は
 Yes を、含まれていない場合は No を出力してください。
```

<h3>解答</h3>

```java:
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int k = sc.nextInt();
        int a[] = new int[n];
        for(int i=0; i<n; i++){
            a[i] = sc.nextInt();
        }
            for(int x:a){
                if(x==k){
                    System.out.println("Yes");
                    sc.close();
                    return;
                }
            }
                    System.out.println("No");
                    sc.close();
                }
            }
```

以下の記事で解いた問題と解き方は同様ですので、
思い出しながらなんとかできました。

https://qiita.com/ki_87/items/a876c5819cc2a7252250

<h3>paizaの解答　booleanを使う</h3>
今まで使ってなかったブール型を使用して答えを導いてるようです。
拡張for文で、trueかfalse という２択のどっちかを返すように
記述しています。

```java:
import java.util.*;

public class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int n = sc.nextInt();
        int k = sc.nextInt();

        int[] a = new int[n];
        for (int i = 0; i < n; i++) {
            a[i] = sc.nextInt();
        }

//ブール型のexist　をfalseにしています。falseを初期値としている。
        boolean exist = false;
        for (int x : a) {
//もし配列の中身と数字が等しければ、existをtrueに変える
            if (x == k) {
                exist = true;
            }
        }

        if (exist) {
            System.out.println("Yes");
        } else {
            System.out.println("No");
        }
    }
}
```


<h2>②要素の種類数</h2>

https://paiza.jp/works/mondai/array_utilization_primer/array_utilization_primer__kind

```
配列 A の要素数 N と配列 A の各要素 A_1, A_2, ..., A_N が与えられるので、
配列 A には何種類の値が含まれているかを求めてください。
```

<h3>解答</h3>

この問題は全然分かりませんでした。
            
```java:
import java.util.*;

public class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int n = sc.nextInt();

        int[] a = new int[n];
        for (int i = 0; i < n; i++) {
            a[i] = sc.nextInt();
        }
//ブール型（真偽型）の配列　existを用意する。長さは０から１００までの１０１
//真偽型の初期値はデフォルトでfalseになってる
//「整数 x は既出か」を exist[x] で判定
        boolean[] exist = new boolean[101];
//count 変数は初期値０にする
        int count = 0;
//拡張for文で中身全部出す
        for (int x : a) {
//if (exist[x]) {が既出なら、処理をスキップする
//そうでないなら、exist[x] を trueにしcount増やす
            if (exist[x]) {
                continue;
            }
            exist[x] = true;
            count += 1;
        }

        System.out.println(count);
    }
}
```

ちょっと難しいので、
以下の入力例で実際に処理を見ていきます。

<h3>入力例を使用して解説</h3>

```
入力例
5
1
2
3
2
1
```

```a[i] = sc.nextInt();```までの処理で、
{1,2,3,2,1}の配列が出来上がりました。

```boolean[] exist = new boolean[101];```で真偽型の配列を作成します。
真偽型なので、中身は{true, false, false, true, true};みたいになります。

拡張for文内で、配列の中身を全部見ます。
真偽型のデフォルト値はfalseです。
まず、```exist[1]```が既出かの判定です。```true```なら処理をスキップしますが、```false```なので、そのまま続きます。
↓
```exist[１]``` を ```true```にします。countを```１```にします。
↓
```exist[２]```も既出では無いので、```false```です。処理を続けます。
↓
```exist[２]```を```true```にし、countに＋１をして```２```になります。
↓
```exist[3]```も既出では無いので、```false```です。処理を続けます。
↓
```exist[３]```を```true```にし、countに＋１をして```３```になります。
↓
```exist[２]```です。これは```true```になっていますので、```continue;```で処理をスキップします。
↓
次に```exist[１]```です。これも```true```、```continue;```で処理をスキップします。

最後に、countを出力し３になります。

<h2>continueは、それ以降の処理をスキップし次の繰り返しへ行く</h2>

continueなんて書いてあると、そのまま「続ける」のかと思うのですが、
continue 文以降の処理をスキップするんですね。

<h3>参考にした記事</h3>

https://www.javadrive.jp/start/for/index10.html

<h2>終わり</h2>