👋

Paiza始動とPaiza充目指して書いたコードの話

2022/02/27に公開

はじめまして。私は、実務未経験でエンジニアを目指す者です。
さっそくですが、転職活動で使えそうなので、Paizaをやり始めました。よりよいPaizaライフを送るべく、ちょっとしたコードを書いたのでシェアします。
https://paiza.jp/

Introduction:Paizaとは?

Paizaは「ITエンジニア向け転職・就活・学習サービス」を提供しています。学習だけでなく、就労にもつながるような関連サービスもあり、個人的にお世話になりたいのが、EN:TRYという所謂「実務未経験者」に特化した求人サイトです。

注目すべきは、このEN:TRYでは、Paizaの学習プラットフォームにおけるプログラミングのスキルランクによって、募集できる企業が変わってくるという仕組みです。つまり、頑張ってPaizaで勉強すれば、「経験者のみ求む」という強固な看板も破れちゃうかもしれません(少なくとも建前上は。それ以降のプロセスでの扱いは、企業毎に異なるというのが実態でしょうが)。

ランク制度:まずはBランク目指す

さて、私のお目当ての企業に応募するためには、Bランクに行かなければいけないと知ったのが先週の金曜日。Paiza内のコードスキルチェックの問題に手をつけ始めたのも先週の金曜日。ということで、この週末はJavaでのコーディング三昧です。

現在、ランクCという「初心者ではなさそうだね」というランクにまで行くことができました。が、お目当てのランクBのテストはまだ受けてません(ひよっている)。何しろ、やり方のイメージはつくし、なんなら他のプログラミングの勉強でやったことがあるような内容も多いのですが、いかんせんコードに落とすところはまだ難しい。「知っている」と「できる」の間にハマりがちなので、まずはランクC以下の問題や、Paiza内のランクアップ問題集を解いています。

ちなみに、Cランクの問題では、基本的な操作がどれだけ着実に使いこなせるかが問われているという印象です。範囲としては、条件分岐やループ文、基礎的な文字列の操作に加え、配列(array)や連想配列(dictionary)、ソートあたり。それぞれの道具の使い方は問われているけれども、組み合わせて使いこなすまでは求められていないようなイメージ。(おそらく使いこなすのは、Bランク以降なのだと推測している)。私はJavaがっつり毎日書いてきました!というよりは、その前段階のコンピューターやネットワークに関する知識など、コンピューターサイエンス全般の基礎固めの方を割とよくやってきた方なので、このような実地訓練はあまり詰めてなかった。という訳で、Paizaで求められているような「Javaを使って『問題』解く」というのは、正直まだまだ慣れていない。Javaの基礎固めには、ちょうどいいかなと思ってやっています。

加えて、このPaizaの問題では、処理速度も評価基準の対象です。今まで、まずはなんとか動くことを念頭にやってきたので、速度を意識したコードを書く練習にもなりそうなので、尚良さそうだなと思っています。

処理速度を意識したコード作成のために行ったこと

さて、上記にあるように、処理速度も大事。ということで、ローカル環境に、Paizaでのコードの実行環境をこしらえました。

template

Practice.java
public class Practice {  
  
	// test cases
	static String test = "";  
	
	public static void main(String[] args) {  
		myans();  
	}  
	
	public static void myans(){  
		// timer start when execution starts
		long start = System.nanoTime();
		
		// Read the test case
		// Scanner sc = new Scanner(System.in); // on Paiza  
		Scanner sc = new Scanner(test);         // on local env.

		/*
		 * Code for Execution
		 */

		// finish the timer when the execution finished
		long end = System.nanoTime();  
		double time = (end - start) / 1000000.0;  
		System.out.println("it took " + time + " in microseconds");
	}

}
  • 大抵の問題で、入力例としてテキスト情報が提示されているので、そのテキストをtestに代入
  • すると、Scannerがその文字情報を読み取ってくれます。ここでScannerを使っているのは、Paiza側のオリジナルのコードと揃えやすくなるため。上記の例で言えば、//on local env.の行を消して//on Paizaの行を有効にすればよい。
  • 最初と最後に、タイマー機能を挿入。これで処理速度が分かる!

example

public class Example {  

	static String test =  
	"TicTacToe";  
	
	public static void main(String[] args) {  
		myans();  
		myans2();  
	}  
	
	public static void myans(){  
		long start = System.nanoTime();  
		
		//    Scanner sc = new Scanner(System.in);  
		Scanner sc = new Scanner(test);  
		
		String line = "", result;  
		int len;  
		
		String str = sc.nextLine();  
		result = "+" + str + "+";  
		len = result.length();  
		
		for (int i = 0; i < len; i++){  
			line += "+";  
		}  
	
		System.out.println("Result with String");  
		System.out.println(line);  
		System.out.println(result);  
		System.out.println(line);  
		
		long end = System.nanoTime();  
		double time = (end - start) / 1000000.0;  
		System.out.println("it took " + time + " in microseconds");  
	}  
	
	public static void myans2(){  
		long start = System.nanoTime();  
		
		Scanner sc = new Scanner(test);  
		
		StringBuilder str = new StringBuilder(sc.nextLine());  
		StringBuilder result = new StringBuilder("+" + str + "+");  
		StringBuilder line = new StringBuilder();  
		
		for(int i = 0; i < result.length(); i++){  
			line.append("+");  
		}  
		
		System.out.println("\nResult with StringBuilder");  
		System.out.println(line);  
		System.out.println(result);  
		System.out.println(line);  
		
		long end = System.nanoTime();  
		double time = (end - start) / 1000000.0;  
		System.out.println("it took " + time + " in microseconds");  
	}
}

出力例

Result with String
+++++++++++
+TicTacToe+
+++++++++++
it took 114.306316 in microseconds

Result with StringBuilder
+++++++++++
+TicTacToe+
+++++++++++
it took 2.288069 in microseconds

こうやって実行時間を図ることができるので、処理の効率の可視化ができたのではと思っています。(もちろん厳密に言えば、処理時間はマシン性能等によって変わってくるでしょうが!)

がんばるぞー!

Discussion