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


初めに

今回以下の2つの問題に挑戦しました。

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

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

①指定要素があるかの判定

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

解答

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();
                }
            }

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

paizaの解答 booleanを使う

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

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");
        }
    }
}

②要素の種類数

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

解答

この問題は全然分かりませんでした。

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を用意する。長さは0から100までの101
//真偽型の初期値はデフォルトでfalseになってる
//「整数 x は既出か」を exist[x] で判定
        boolean[] exist = new boolean[101];
//count 変数は初期値0にする
        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);
    }
}

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

入力例を使用して解説

入力例
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[1]trueにします。countをにします。

exist[2]も既出では無いので、falseです。処理を続けます。

exist[2]trueにし、countに+1をしてになります。

exist[3]も既出では無いので、falseです。処理を続けます。

exist[3]trueにし、countに+1をしてになります。

exist[2]です。これはtrueになっていますので、continue;で処理をスキップします。

次にexist[1]です。これもtruecontinue;で処理をスキップします。

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

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

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

参考にした記事

終わり