0
0

More than 1 year has passed since last update.

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

Posted at

初めに

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

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

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

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

配列 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 文以降の処理をスキップするんですね。

参考にした記事

終わり

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0