高度情報システム科 ブログ

最優秀賞者のプログラム精解!(その1)

2018.12.01

先日行われたJavaのプログラミングコンテストでは、高度ITエンジニア科2年の学生が2連覇を達成しました!

コンテストの様子

制限時間4時間という限られた時間内でのプログラミングのため、さすがに20問全問正解とはなりませんでしたが、それでも最優秀賞者のソースコードはレベルが違いました。

そこで彼のソースコードの一部を紹介していきたいと思います。


問題全体はここでは公開できませんが、例として、ネットワーク関連の問題の要点部分を紹介します。

文字列 str にIPv4アドレスがサブネットマスクのサフィックス付きで与えられたときに、ネットワークアドレスとブロードキャストアドレスを表示することを考えます。

たとえば、str に 192.168.61.145/26 が与えられたとき、期待される表示結果は

192.168.61.128
192.168.61.191

となります。


どのように処理したらいいでしょうか?

方針は立てられますか?


まずはコードの冒頭だけ紹介します。


String[] sp = str.split("[\\./]");
int a = Integer.parseInt(sp[0]);
int b = Integer.parseInt(sp[1]);
int c = Integer.parseInt(sp[2]);
int d = Integer.parseInt(sp[3]);
int z = Integer.parseInt(sp[4]);

str を分解して数値化しています。当然必要な処理ですね。

Stringクラスのsplitメソッドは区切り文字を指定して文字列の分割を行い、結果をString型の配列で返します。

はじめに / で分割し、次に . で分割、と二段階でやりたくなるところですが、split("[\\./]")のように一回でできてしまうんですね。

細かいところですが、スマートです。

なおバックスラッシュ(\)が2個並ぶのは、正規表現として . をエスケープするための \ を Java の文字列内で表現するにはさらに \ をつけてエスケープする必要があるからです。


IPアドレスを8ビット区切りで int 化してa~dに代入したわけですが、普通は(常人は?)配列を用意しループ処理なんかもしたくなるところ。

でも要素は4つで固定だし、a、b、c、dという変数はかえって分かりやすいのかもしれませんね。

zという変数も、一番後ろ、という感じが出ています。

なおJavaでは、変数名は第三者が見てもすぐ分かるようにオブジェクトの意味を直接表す名前にするのが作法です。今回はコンテスト用だと思ってください。


これで処理の準備は整いました。

このあとどうするのか?興味のある人は考えてみてください。

続きは次回までのお楽しみとしたいと思います。

 

↑