taiPyのお悩み解決ブログ

日々の発見をまとめます!

Java解答例:競技プログラミングの鉄則 演習問題集 A03 - Two Cards

目次

はじめに

競技プログラミングの鉄則 演習問題集 の「A04 - Binary Representation 1」という問題の自分が書いた解答例。著者の本を読んで、それから、コーディングしています。コーディングするときに詰まったポイントについて書いているので、ぜひ。

問題文

A03 - Two Cards

解答例

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        int K = sc.nextInt();
        int[] P = new int[N];
        for (int i = 0; i < P.length; i++) {
            P[i] = sc.nextInt();
        }
        int[] Q = new int[N];
        for (int i = 0; i < Q.length; i++) {
            Q[i] = sc.nextInt();
        }
        sc.close();

        boolean flag = false;
        for (int i = 0; i < P.length; i++) {
            for (int j = 0; j < Q.length; j++) {
                if (K == (P[i] + Q[j])) {
                    flag = true;
                }
            }
        }
        
        if (flag) {
            System.out.println("Yes");
        } else {
            System.out.println("No");
        }
    }
}

公式の解答例はこちら「https://github.com/E869120/kyopro-tessoku/blob/main/codes/java/chap01/answer_A03.java

解説

公式の解答例では{}が省略されていたり、改行されていなかったりする。そちらの方がメモリを圧迫しないので、いいと思う。だが、実際に書くときは見やすさや見慣れている、書きやすい方を使ったらいいと思う。

ポイントはFlagを使う所かと。YesかNoで問題に答えるときは時は、Flagを立てて、そこに結果を保存するということがよく使われる。

        // フラグを立てて
        boolean flag = false;
        for (int i = 0; i < P.length; i++) {
            for (int j = 0; j < Q.length; j++) {
                // もし該当する数字があったら
                if (K == (P[i] + Q[j])) {
                    // 結果を保存する
                    flag = true;
                }
            }
        }
        
        // フラグの結果に応じて出力を変える。TrueならYes,FalseならNo。
        if (flag) {
            System.out.println("Yes");
        } else {
            System.out.println("No");
        }

後は、Javaの文法になる。「=」と「==」の違い。

  • 「=」は代入するときに使う。例えば、Aを5を代入する。
  • 「==」は比較するときに使う。例えば、AはBと同じかどうか。

もう一つのポイントはforを2重で使用していること。これはマス目を思い浮かべると分かりやすい。

所感

意外とサクサクできてうれしかった。このちょーしで頑張るぞー!

参考文献