プログラミング初心者修行シリーズ第二弾。
Progateにて基礎の学習を進め、実践的な問題にも挑戦していきたいと思い、paizaラーニングで提供されている問題に挑戦してみました。このシリーズでは自分の学習の振り返りもかねて記事にしていこうと考えていますので、間違った表現があるかもしれませんが、そこはご了承ください(笑)
今回は「paizaラーニング(スキルチェック過去問題集)」より出題された「検索履歴(Cランク相当)」になります。
※ちなみに、paizaラーニングでは過去問題のみコード公開が可能なのでご注意ください。
問題
”Question:検索ワード W が N 個与えられるので、N 個の検索ワードが与えられた後の履歴を表示するプログラムを書いてください。
ただし、入力は合計 N + 1 行であり、 最終行の末尾に改行が 1 つ入り、文字列は標準入力から渡されます。
検索ワード W が以前に入力されたことがある場合:
・履歴中の W を削除する。
・履歴の先頭に W を追加する。
検索ワード W が以前に入力されたことがない場合:
・履歴の先頭に W を追加する。”
私はこの問題を理解しやすくするために、コード云々よりも図式して整理してみることにしました。ブラウザ上でのイラストをマウスで描いたので汚いですが、一応メモなのでそこは…(笑)
?検索ワードW(A),W(B),W(C)…がN個与えられる。
=配列の要素(value)の数分,配列arrayに加えていく。
?空箱配列を作り、$arrayの要素を順番に空箱配列の先頭に差し込んでいく。(array_unshift関数)
?重複していた場合は重複した値を削除する。(array_unique関数)
?配列unique_boxの中の要素を順番に出力し、それぞれ改行を行う。
一度図式化してみることでコードを書く順番の参考にしました。
今回も自分の知らない知識を使って解かないといけないらしい、ということが調べていくうちに分かってきたため、とにかくググっていきました。
それでは今回の解答コードも紹介していきます。
解答コード
<?PHP
$input_line=trim(fgets(STDIN));
for($i=0;$i<$input_line;$i++){
$array[]=trim(fgets(STDIN));
}
$empty_box=array();
foreach($array as $value){
array_unshift($empty_box,$value);
$unique_box=array_unique($empty_box);
}
foreach($unique_box as $value){
echo $value."\n";
}
?>
全ての入力例15個を通過し正解することが出来ました。
学んだコード
プログラムに渡される値やデータの標準(デフォルト)の入力元のこと。ただしファイルからのデータの読み込みの場合は、
standard input (標準入力)→「stdin」と略されて使用されることが多い
・for文=繰り返し回数が既知の場合、カウンタと呼ばれるループ処理を制御する変数を使って繰り返し処理を行う。
・array_unshift関数=配列の先頭に必要な数だけ値を追加する
( $array, ‘追加する値1’, ‘追加する値2’, ‘追加する値3’)
・fgets関数=ファイルの読み込みを行う関数
・trim関数=文字列の先頭と末尾にある空白文字を取り除く
・array_unique関数=PHPの配列で重複した値を削除する
・foreach文=配列の中にある要素の数分、先頭から順番に繰り返し処理を行う
・「“\n”」=改行コード
最後に
今回でまだ2問目になりますが、自分で調べてコードを書くことがこんなにも身に入っていくとは思いませんでした。YouTubeでもエンジニアの人の勉強の仕方のアドバイスで「とにかくアウトプットした方が良い」ということはよく耳にしていたのですが、実際に見て学ぶより書いて学ぶ方が頭に残るのは不思議な感覚です。
問題に対して自分なりに調べ(インプット)、実際にコードを書いてみて正解までもっていく(アウトプット)。これをブログの記事を通して、もう一度見直し復習(インプット)とアウトプットを行うルーティーンが一番の勉強になっていると感じている次第です。
プログラミング初心者の私はまだまだ勉強の仕方に対しても工夫していこうと思うのでした。
では、また?