Programming

【AOJ】Java初心者がAizu Online Judgeの問題解いてみた【前編】

こんにちは、Web系エンジニアになって2週間の駆け出しエンジニアあむです。
今回は、AOJ(Aizu Online Judge)という会津大学が主催しているプログラミングテストを解いていて、つまづいたところやここむずいなーと思ったところをシェアしていきたいと思います。


いろんな言語で解けますが、今回はJavaのみを使って解いていきます。


駆け出しのコードなので、暖かい目で見守ってくださるとありがたいです。orz


それでは、行ってみましょー( ◠‿◠ )

【AOJ】プログラミング入門コース 目次


  • 三つの数の整列(2_C)
  • テストケースの出力(3_B)



今回は上記をやっていきます。

三つの数の整列(2_C)



こちらの問題は、「三つの数を入れた時、それを小さい数から大きい数に並べ替えよ」ということですね。
例えば、「3 8 1」の三つの数字を入れたとしたら、「1 3 8」といったように並べ替えるプログラムです。
問題はこちら
私のコードはこちら。

import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int a = sc.nextInt();
        int b = sc.nextInt();
        int c = sc.nextInt();

        if (a <= b && b <= c){
            System.out.println(a + " " + b + " " + c);
        } else if (a <= c && c <= b) {
            System.out.println(a + " " + c + " " + b);
        } else if(b <= a && a <= c){
            System.out.println(b + " " + a + " " + c);
        } else if (b <= c && c <= a){
            System.out.println(b + " " + c + " " + a);
        }else if (c <= a && a <= b){
            System.out.println(c + " " + a + " " + b);
        } else if (c <= b && b <= a){
            System.out.println(c + " " + b + " " + a);
        }

    }
}

全て6通りしかないので全て書き出しました笑


これが100通りとか1000通りとかになると無理ゲーですよね。


解説しようもないコードですが、一応解説すると、整数「a b c」を一つずつ比べてそれを、「こう並べてください!」と命令を出しているだけです。


ここで注意点は、比べるときに「a <= b」のようにイコールを入れてあげないと、もし入力された数字が「10 15 10」だった場合にうまく出力されないのでイコールをつけるのだけは忘れないでください。


ありがたいことにAOJでは、他のプログラマーのコードを見れるようになっているので、「どうしたらもっと効率よくアルゴリズムを組めるか」を学ぶことができます。


見辛くてスミマセンorz
ここに「Solution」とあるのでここをクリックします。

すると、「Confirm」とでてくるのでここをクリックします。

「View only public」とあるのでそこにチェックを入れ、「Code size」を選択すると、めちゃくちゃ短いコードで処理できることをしり、衝撃を覚えます・・・・・・


この、「三つの数の数列」をめちゃくちゃ短いコードで処理するとなると「配列」を使って、「forループ」で処理をくりかえすコードが多く見受けられました。
一番短いコードは「split」を使って数を抜き出していくということでしたが、自分にはまだよくわかりませんでした・・・汗


テストケースの出力(3_B)

問題はこちら


こちらの問題は、例えば「3」と入力したら、「Case 1: 3」と出力し、「3」の次に「5」を入力したら、「5」は2回目の入力なので、「Case 2: 5」と出力されるようなプログラムです。

私が最初に書いたコードはこちら。

import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while(true){
            int n = sc.nextInt();
            if( n == 0){
                break;
            }
            for(int i = 1; i < 10000; i++){
                System.out.println("Case " + i + ": " + n);
            }
        }
    }
}

これだと、出力結果が画像のようになります。欲しい結果とは程遠いですね笑



「3」と入力すると、「Case i: 3」が10000回出力されてしまっています。


改善したコードが以下です。


import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int i = 1;
        while(true){
            int x = sc.nextInt();
            if( x == 0){
                break;
            }
            System.out.println("Case " + i + ": " + x);
            i++;
        }
    }
}

まず、この問題は入力する文字「x」が「0」だった場合、処理を中止しなければいけないので、while文の中で条件分岐をし、ループを抜けます。


xはwhile文の中で定義し、「int i(数える数)」はwhile文の外で定義してあげます。この問題では、「iは1から始まる」とあるので初期値は1です。


ちなみに、もし仮にここで「int i = 1」をwhile文の中で定義したとなると、いくらxに文字を入力してもずっと「Case 1: x」と出力するようになりますのでご注意を。


「System.out.println」の後に「i++」でカウントしてあげるのもポイントです。この処理が「Case 1, Case 2, Case 3…」と増やしてくれているので重要です。


初心者に陥りやすいミスは、「定義する位置」、「カウントする位置」だと思うので、色々動かしながら出力するのも手です。が、一番重要なのは「なぜこのコードはここにあるか」「この処理は何をしているか」などがちゃんと明確に理解できていることです。


基礎から少しずつ着実にやっていきましょう。

ではまた( ◠‿◠ )

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA